一次使用2个元素的FOR语句python

时间:2012-07-26 01:50:23

标签: 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显示为matchign但我不想计算C因为只有C中的“one”元素在mastervariable中(即2只在mastervariable中显示一次而不是两次)

我目前的效率很低:

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.

然后我继续像上面那样通过每次检查每个非常低效的迭代来迭代。我做了以上操作,因为使用FOR语句导致我检查第一个元素两次是不正确的:

For i in a:
      for j in a:
           ### this checked if 1 was in the master variable and not 1,5 or 1,7

有没有办法使用2 FOR语句,允许我一次检查列表中的2个元素,同时跳过已经使用过的任何元素?或者,你能建议一个有效的方法来做我正在尝试的事情吗?

编辑:Mastervariable可以包含重复项。

2 个答案:

答案 0 :(得分:1)

看起来好像套装好。编辑:集合不合适,因为mastervariable可以包含重复项。这是一个使用计数器的版本。

>>> 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

答案 1 :(得分:1)

对于可以复制匹配元素以便set中断的情况,请使用Counter作为多重集 - amaster之间的重复项可通过以下方式找到:< / p>

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]})

逻辑是相当直观的:如果amaster的组合计数中有更多项目,那么它会被复制,然而多重性是该项目中的许多项目中的任何一项amaster的人数较少。

它给出了所有重复项的计数器,其中计数是它们的多样性。如果你想把它作为一个元组,你可以tuple(dups.elements())

>>> 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)