在python中同时对2个元素使用FOR语句
我有下面的变量列表和一个主变量在python中同时对2个元素使用FOR语句,python,Python,我有下面的变量列表和一个主变量 a=(1,5,7) b=(1,3,5) c=(2,2,2) d=(5,2,8) e=(5,5,8) mastervariable=(3,2,5) 我试图检查主变量中是否存在每个变量中的2个元素,这样上面显示的B(3,5)和D(5,2)是至少有2个元素与主变量匹配的元素。还要注意,使用集合会导致C显示为MatchSign,但我不想计算C,因为C中只有“一个”元素在主变量中(即2在主变量中只显示一次,而不是两次) 我目前的工作效率非常低: if current_var
a=(1,5,7)
b=(1,3,5)
c=(2,2,2)
d=(5,2,8)
e=(5,5,8)
mastervariable=(3,2,5)
我试图检查主变量中是否存在每个变量中的2个元素,这样上面显示的B(3,5)和D(5,2)是至少有2个元素与主变量匹配的元素。还要注意,使用集合会导致C显示为MatchSign,但我不想计算C,因为C中只有“一个”元素在主变量中(即2在主变量中只显示一次,而不是两次)
我目前的工作效率非常低:
if current_variable[0]==mastervariable[0]:
if current_variable[1] = mastervariable[1]:
True
elif current_variable[2] = mastervariable[1]:
True
#### I don't use OR here because I need to know which variables match.
elif current_variable[1] == mastervariable[0]: ##<-- I'm now checking 2nd element
etc. etc.
有没有一种方法可以使用2 FOR语句,允许我一次检查列表中的2个元素,同时跳过已经使用过的任何元素?或者,你能建议一个有效的方法来做我正在尝试的事情吗
编辑:主变量中可以有重复项 对于电视台来说似乎是个不错的工作。编辑:集合不适用,因为主变量可能包含重复项。这是一个使用计数器的版本
>>> a = (1,5,7)
>>>
>>> b = (1,3,5)
>>>
>>> c = (2,2,2)
>>>
>>> d = (5,2,8)
>>>
>>> e = (5,5,8)
>>> D=dict(a=a, b=b, c=c, d=d, e=e)
>>>
>>> from collections import Counter
>>> mastervariable = (5,5,3)
>>> mvc = Counter(mastervariable)
>>> for k,v in D.items():
... vc = Counter(v)
... if sum(min(count, vc[item]) for item, count in mvc.items())==2:
... print k
...
b
e
对于可以复制匹配元素以使
set
中断的情况,将其用作多集-可通过以下方式找到a
和master
之间的重复项:
count_a = Counter(a)
count_master = Counter(master)
count_both = count_a + count_master
dups = Counter({e : min((count_a[e], count_master[e])) for e in count_a if count_both[e] > count_a[e]})
逻辑相当直观:如果在a
和master
的组合计数中有更多的项目,那么它是重复的,并且多重性是无论a
和master
中哪个项目的数量较少
它给出了所有重复项的计数器,其中计数是它们的重数。如果要将其作为元组返回,可以执行tuple(dups.elements())
:
集合的问题是,它们会将变量C显示为true,但变量C有2,2,2,而主变量有3,2,5,这意味着两个元素不匹配如果主变量可以有重复项,则集合可能仍然有问题。无需使用
.get
和计数器-计数器()['a']
->0.mastervariable可以有重复项吗?@gnibler是的,mastervariable可以有重复项您是否担心您的方法会花费很多时间,或者它会花费很多代码?我担心它会花费很多代码,因为我想我最终需要编写类似的函数,如果您注意到,提供的解决方案允许我测试3以上的变量elements@Ivc这看起来很棒。谢谢也谢谢大家,很抱歉我对我的问题做了糟糕的解释
count_a = Counter(a)
count_master = Counter(master)
count_both = count_a + count_master
dups = Counter({e : min((count_a[e], count_master[e])) for e in count_a if count_both[e] > count_a[e]})
>>> a
(2, 2, 2)
>>> master
(1, 2, 2)
>>> dups = Counter({e : min((count_a[e], count_master[e])) for e in count_a if count_both[e] > count_a[e]})
>>> tuple(dups.elements())
(2, 2)