【问题标题】:find, collect duplicates in list of lists/sets在列表/集合列表中查找、收集重复项
【发布时间】:2016-06-30 22:56:04
【问题描述】:

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

可以逐个遍历a,将每个 2-list 设为frozenset,将其排序到字典中等等。不用说,如果 ab 是大。

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

【问题讨论】:

  • b2是怎么来的? set(map(frozenset, a)) 也会非常高效
  • @PadraicCunningham 澄清了这一点。

标签: python list unique


【解决方案1】:

如果你想保持秩序和分组,我认为你不会比使用 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。

【讨论】:

  • defaultdict 示例在循环中缺少 b([ind])。
  • @NicoSchlömer,确实,已修复。
【解决方案2】:

对于一个:

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 的回答很到位。

【讨论】:

    猜你喜欢
    • 2011-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-15
    • 1970-01-01
    • 2013-11-17
    • 2015-11-24
    相关资源
    最近更新 更多