Skip to main content
 首页 » 编程设计

python之在列表/集合列表中查找、收集重复项

2025年05月04日24yjmyzz

在 Python 中,我有一个元组列表和一个长度相同的整数列表,例如,

a = [ 
    [1, 2], 
    [3, 2], 
    [4, 66], 
    [2, 3] 
    ] 
 
b = [ 
    1, 
    31, 
    31, 
    44 
    ] 

a 中的第 k 个条目可以认为是与 b 中的第 k 个条目相关联。

条目 [3, 2] 和 [2, 3] 对我来说真的是一样的,我想要 a考虑到这一点。另外,我想要一个属于新的唯一列表的条目列表。对于上面的例子,

a2 = [ 
    [1, 2], 
    [3, 2],  # or [2, 3] 
    [4, 66] 
    ] 
 
b2 = [ 
    [1], 
    [31, 44], 
    [31] 
    ] 

b2[0] 是 [1],因为 [1, 2] 仅与 1 关联. b2[1] 是 [31, 44] 因为 [2, 3] (等于 [3, 2] 与 a 中的 31 和 44 相关联。

可以一个接一个地遍历一个条目,使每个2-list成为一个frozenset,将其分类到一个字典中等等。不用说,如果,这不会很好地执行a 和 b 很大。

关于如何更聪明地处理这个问题的任何提示? (列出理解?)

请您参考如下方法:

如果你想维持秩序和分组,我认为你不会比使用 OrderedDict 分组更好:

from collections  import OrderedDict 
a = [ 
    [1, 2], 
    [3, 2], 
    [4, 66], 
    [2, 3] 
    ] 
 
b = [1, 31, 31, 44] 
d = OrderedDict() 
for ind, f in enumerate(map(frozenset, a)): 
        d.setdefault(f, []).append(b[ind]) 
 
print(list(d), list(d.values())) 

这会给你:

[frozenset({1, 2}), frozenset({2, 3}), frozenset({66, 4})] [[1], [31, 44], [31]] 

如果看到的顺序无关紧要,请使用defaultdict:

from collections  import defaultdict 
a = [ 
    [1, 2], 
    [3, 2], 
    [4, 66], 
    [2, 3] 
    ] 
 
b = [1, 31, 31, 44] 
d = defaultdict(list) 
for ind, f in enumerate(map(frozenset, a)): 
        d[f].append(b[ind]) 
 
print(list(d), list(d.values())) 

这会给你:

 [frozenset({1, 2}), frozenset({2, 3}), frozenset({66, 4})] [[1], [31, 44], [31]] 

如果你真的想要列表或元组:

print(list(map(list, d)), list(d.values())) 

这会给你:

[[1, 2], [2, 3], [66, 4]] [[1], [31, 44], [31]] 

对于 python2,您应该使用 itertools.izip 和 itertools.imap 代替 map 和 zip。