我有以下变量列表和一个主变量
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可以包含重复项。
答案 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
作为多重集 - a
和master
之间的重复项可通过以下方式找到:< / 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]})
逻辑是相当直观的:如果a
和master
的组合计数中有更多项目,那么它会被复制,然而多重性是该项目中的许多项目中的任何一项a
和master
的人数较少。
它给出了所有重复项的计数器,其中计数是它们的多样性。如果你想把它作为一个元组,你可以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)