0

我有以下变量列表和一个主变量

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 中只有“一个”元素在 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 中可以有重复项。

4

2 回答 2

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
于 2012-07-26T01:52:49.050 回答
1

对于可以复制匹配元素以致set中断的情况,Counter请用作多重集 - 和之间的重复项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]})

逻辑相当直观:如果 and 的组合计数中有更多的项目amaster则它是重复的,并且多重性是该项目中的许多项目在其中任何一个中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)
于 2012-07-26T02:20:10.597 回答