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

Python 在列表/集合列表中查找、收集重复项,python,list,unique,Python,List,Unique,在Python中,我有一个元组列表和一个长度相同的整数列表,例如 a = [ [1, 2], [3, 2], [4, 66], [2, 3] ] b = [ 1, 31, 31, 44 ] 可以认为a中的第k个条目与b中的第k个条目相关联 对我来说,条目[3,2]和[2,3]实际上是一样的,我希望在脑海中有一个统一的概念。另外,我想要一个属于新的唯一列表的条目列表。对于上面的例子 a2 = [ [1, 2

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

a = [
    [1, 2],
    [3, 2],
    [4, 66],
    [2, 3]
    ]

b = [
    1,
    31,
    31,
    44
    ]
可以认为a中的第k个条目与b中的第k个条目相关联

对我来说,条目[3,2]和[2,3]实际上是一样的,我希望在脑海中有一个统一的概念。另外,我想要一个属于新的唯一列表的条目列表。对于上面的例子

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],因为等于[3,2]的[2,3]与a中的31和44相关联

可以一个条目一个条目地浏览,将每个2-list设置为一个冻结集,将其排序到字典中,等等。不用说,如果a和b都很大,那么这种方法的性能就不太好

关于如何更聪明地处理这个问题,有什么提示吗?列出理解?

对于:

a = [
    [1, 2],
    [3, 2],
    [4, 66],
    [2, 3]
    ]

a_set = {frozenset(i) for i in a}
a2 = list(list(i) for i in a_set)
print(a2)
# -> [[66, 4], [1, 2], [2, 3]]
不知道你在找b干什么

编辑:这更有意义@帕德雷坎宁厄姆的答案恰到好处。

a = [
    [1, 2],
    [3, 2],
    [4, 66],
    [2, 3]
    ]

a_set = {frozenset(i) for i in a}
a2 = list(list(i) for i in a_set)
print(a2)
# -> [[66, 4], [1, 2], [2, 3]]
不知道你在找b干什么


编辑:这更有意义@PadraicCunningham的答案是正确的。

如果你想维持秩序和分组,我认为你不会比用一个有序的信息分组更好:

这将给你:

[frozenset({1, 2}), frozenset({2, 3}), frozenset({66, 4})] [[1], [31, 44], [31]]
 [frozenset({1, 2}), frozenset({2, 3}), frozenset({66, 4})] [[1], [31, 44], [31]]
[[1, 2], [2, 3], [66, 4]] [[1], [31, 44], [31]]
如果看到的顺序不相关,请使用defaultdict:

这将给你:

[frozenset({1, 2}), frozenset({2, 3}), frozenset({66, 4})] [[1], [31, 44], [31]]
 [frozenset({1, 2}), frozenset({2, 3}), frozenset({66, 4})] [[1], [31, 44], [31]]
[[1, 2], [2, 3], [66, 4]] [[1], [31, 44], [31]]
如果确实需要列表或元组:

print(list(map(list, d)), list(d.values()))
这将给你:

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

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

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

这将给你:

[frozenset({1, 2}), frozenset({2, 3}), frozenset({66, 4})] [[1], [31, 44], [31]]
 [frozenset({1, 2}), frozenset({2, 3}), frozenset({66, 4})] [[1], [31, 44], [31]]
[[1, 2], [2, 3], [66, 4]] [[1], [31, 44], [31]]
如果看到的顺序不相关,请使用defaultdict:

这将给你:

[frozenset({1, 2}), frozenset({2, 3}), frozenset({66, 4})] [[1], [31, 44], [31]]
 [frozenset({1, 2}), frozenset({2, 3}), frozenset({66, 4})] [[1], [31, 44], [31]]
[[1, 2], [2, 3], [66, 4]] [[1], [31, 44], [31]]
如果确实需要列表或元组:

print(list(map(list, d)), list(d.values()))
这将给你:

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

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

b2是如何产生的?还有setmapfrozenset,a会很漂亮efficient@PadraicCunningham澄清了这一点。b2是如何产生的?还有setmapfrozenset,a会很漂亮efficient@PadraicCunningham澄清了这一点。defaultdict示例在循环中缺少一个b[ind]。@NicoSchlömer,确实修复了。defaultdict示例在循环中缺少一个b[ind]。@NicoSchlömer,确实修复了。