Python 在列表/集合列表中查找、收集重复项
在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
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,确实修复了。