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

Nic*_*mer 1 python list unique

在Python中,我有一个元组列表和一个长度相同的整数列表,例如,

a = [
    [1, 2],
    [3, 2],
    [4, 66],
    [2, 3]
    ]

b = [
    1,
    31,
    31,
    44
    ]
Run Code Online (Sandbox Code Playgroud)

第k个条目a可以被认为与第k个条目相关联b.

条目[3, 2][2, 3]真的对我来说是相同的,我想a考虑到这一点uniquified.另外,我想要一个属于新唯一列表的条目列表.对于上面的例子,

a2 = [
    [1, 2],
    [3, 2],  # or [2, 3]
    [4, 66]
    ]

b2 = [
    [1],
    [31, 44],
    [31]
    ]
Run Code Online (Sandbox Code Playgroud)

b2[0][1]因为[1, 2]只与相关1.b2[1][31, 44]因为[2, 3](等于[3, 2]与相关联3144a.

可以通过a条目进入,使每个2列表成为冻结集,将其排序成字典等.不用说,如果a并且b很大,这不会很好.

关于如何处理这个更智能的任何提示?(列表理解?)

Pad*_*ham 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()))
Run Code Online (Sandbox Code Playgroud)

哪个会给你:

[frozenset({1, 2}), frozenset({2, 3}), frozenset({66, 4})] [[1], [31, 44], [31]]
Run Code Online (Sandbox Code Playgroud)

如果看到的顺序无关紧要,请使用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()))
Run Code Online (Sandbox Code Playgroud)

哪个会给你:

 [frozenset({1, 2}), frozenset({2, 3}), frozenset({66, 4})] [[1], [31, 44], [31]]
Run Code Online (Sandbox Code Playgroud)

如果你真的想要列表或元组:

print(list(map(list, d)), list(d.values()))
Run Code Online (Sandbox Code Playgroud)

哪个会给你:

[[1, 2], [2, 3], [66, 4]] [[1], [31, 44], [31]]
Run Code Online (Sandbox Code Playgroud)

对于python2,你应该使用itertools.izipitertools.imap代替map和zip.