gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 08:02:13 25 4
gpt4 key购买 nike

在 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 中的 3144 相关联。

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

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

最佳答案

如果你想维持秩序和分组,我认为你不会比使用 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.izipitertools.imap 代替 map 和 zip。

关于python - 在列表/集合列表中查找、收集重复项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38134534/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com