[英]python compare a list of lists efficiently
I have a long list of long lists so efficiency is an issue for me. 我有很长的长列表,所以效率对我来说是一个问题。 I wondered if there was a neater way of comparing a list of lists other than looping over a list within a loop of the same list (easier to see by example) 我想知道是否有一种更简洁的方法来比较列表列表而不是循环遍历同一列表的循环中的列表(更容易通过示例查看)
matchList=[]
myList = [ ('a',[1,2,3]), ('b', [2,3,4]), ('c', [3,4,5]), ('d', [4,5,6]) ]
tup_num=1
for tup in myList:
for tup2 in myList[tup_num:]:
id=str(tup[0])+':'+str(tup2[0])
matches=set(tup[1]) & set(tup2[1])
matchList.append((id,matches))
tup_num+=1
print matchList
Output: 输出:
[('a:b', set([2, 3])), ('a:c', set([3])), ('a:d', set([])), ('b:c', set([3, 4])), ('b:d', set([4])), ('c:d', set([4, 5]))]
This works and doesn't repeat comparisons but I'm sure there must be a better way of doing it. 这是有效的,不会重复比较,但我确信必须有更好的方法。
Cheers 干杯
Using itertools.combinations
: 使用itertools.combinations
:
>>> import itertools
>>> matchList = []
>>> myList = [('a',[1,2,3]), ('b', [2,3,4]), ('c', [3,4,5]), ('d', [6,7,8])]
>>> matchList = [
... ('{}:{}'.format(key1, key2), set(lst1) & set(lst2))
... for (key1, lst1), (key2, lst2) in itertools.combinations(myList, 2)
... ]
>>> matchList
[('a:b', set([2, 3])), ('a:c', set([3])), ('a:d', set([])), ('b:c', set([3, 4])), ('b:d', set([])), ('c:d', set([]))]
Like this: 像这样:
>>> from itertools import combinations
>>> l
[('a', [1, 2, 3]), ('b', [2, 3, 4]), ('c', [3, 4, 5]), ('d', [6, 7, 8])]
>>> l = [(i, set(j)) for i, j in l]
>>> l
[('a', {1, 2, 3}), ('b', {2, 3, 4}), ('c', {3, 4, 5}), ('d', {8, 6, 7})]
>>> [("%s:%s" % (l1[0], l2[0]), l1[1] & l2[1]) for l1, l2 in combinations(l, 2)]
[('a:b', {2, 3}), ('a:c', {3}), ('a:d', set()), ('b:c', {3, 4}), ('b:d', set()), ('c:d', set())]
Using composition and generators makes it clear: 使用组合和生成器清楚地表明:
from itertools import combinations
matchList = []
myList = [ ('a',[1,2,3]), ('b', [2,3,4]), ('c', [3,4,5]), ('d', [4,5,6]) ]
def sets(items):
for name, tuple in items:
yield name, set(tuple)
def matches(sets):
for a, b in combinations(sets, 2):
yield ':'.join([a[0], b[0]]), a[1] & b[1]
print list(matches(sets(myList)))
>>> [('a:b', set([2, 3])), ('a:c', set([3])), ('a:d', set([])), ('b:c', set([3, 4])), ('b:d', set([4])), ('c:d', set([4, 5]))]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.