在 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。
