在Python中查找列表中的类似项的有效方法

时间:2013-12-12 18:10:43

标签: python

我有一个列表清单如下:

list_1 = [[[1,a],[2,b]], [[3,c],[4,d]], [[1,a],[5,d]], [[8,r],[10,u]]]

我试图找出一个元素是否与此列表类似于另一个元素。现在,我循环两次,即每个元素,检查其余元素。我的输出是:

[[[1,a],[2,b]], [[1,a],[5,d]]]

有没有办法更有效地做到这一点?

感谢。

2 个答案:

答案 0 :(得分:2)

您可以使用itertools.combinationsany这样的功能

from itertools import combinations
for item in combinations(list_1, 2):
    if any(i in item[1] for i in item[0]):
        print item

<强>输出

([[1, 'a'], [2, 'b']], [[1, 'a'], [5, 'd']])

答案 1 :(得分:1)

我假设,类似地,你的意思是该元素中至少有一个匹配对。在这种情况下,您可以将每个元素映射到列表的两次(对于其中的每个[number,str]对一次),而不是执行嵌套循环。完成后,dict中的每个键都将映射到包含该键的元素列表(即相似)。

示例代码:

list_1 = [[[1,'a'],[2,'b']], [[3,'c'],[4,'d']], [[1,'a'],[5,'d']], [[8,'r'],[10,'u']]]

d = {}

for elt in list_1:
    s0 = '%d%s' % (elt[0][0], elt[0][1])
    if s0 in d:
        d[s0].append(elt)
    else:
        d[s0] = [elt]

    s1 = '%d%s' % (elt[1][0], elt[1][1])
    if s1 in d:
        d[s1].append(elt)
    else:
        d[s1] = [elt]

for key in d.keys():
    print key, ':', d[key]

示例输出:

1a : [[[1, 'a'], [2, 'b']], [[1, 'a'], [5, 'd']]]
8r : [[[8, 'r'], [10, 'u']]]
2b : [[[1, 'a'], [2, 'b']]]
3c : [[[3, 'c'], [4, 'd']]]
5d : [[[1, 'a'], [5, 'd']]]
4d : [[[3, 'c'], [4, 'd']]]
10u : [[[8, 'r'], [10, 'u']]]

任何长度为&gt;的dict条目1具有类似的元素。假设您有办法获得a,b,c等的字符串表示,这会将代码的运行时复杂性降低到O(n)。