查找,收集列表/集列表中的重复项

时间:2016-06-30 22:56:05

标签: 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]对我来说真的是一样的,我希望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]31中的44a相关联。

可以通过条目遍历a条目,使每个2列表成为冻结集,将其排序为字典等。不用说,如果ab并不是很好sqlite3很大。

有关如何处理这种智慧的任何提示? (列表理解?)

2 个答案:

答案 0 :(得分:5)

如果您想维护订单和组,我认为您不会比使用 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。

答案 1 :(得分:1)

对于:

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的回答是正确的。