在python中压缩集合和列表

时间:2018-01-17 18:38:46

标签: python list set zip

我试图在列表中找到重复项。我想保留值并将它们插入到具有出现次数的元组中。

例如:

list_of_n = [2, 3, 5, 5, 5, 6, 2]
occurance_of_n = zip(set(list_of_n), [list_of_n.count(n) for n in set(list_of_n)])

[(2, 2), (3, 1), (5, 3), (6, 1)]

这适用于小套装。我的问题是:当list_of_n变大时,我是否必须担心zip中的arg1和arg2(arg1,arg2)如果它们是相同的集合则没有正确排列?

即。是否有一个可以想象的未来我调用zip()并且它意外地将arg1中list_of_n的index [0]与arg2中的list_of_n的其他索引对齐?

(如果不清楚的话,我会在arg2中将列表转换为一组用于速度的目的,并假设如果zip在相同的情况下表现得更好ARG1)

1 个答案:

答案 0 :(得分:0)

由于您的示例输出会保留外观顺序,因此您可能希望使用collections.OrderedDict来收集计数:

list_of_n = [2, 3, 5, 5, 5, 6, 2]
d = OrderedDict()
for x in list_of_n:
    d[x] = d.get(x, 0) + 1
occurance_of_n = list(d.items())
# [(2, 2), (3, 1), (5, 3), (6, 1)]

如果顺序无关紧要,适当的方法是使用collections.Counter

occurance_of_n = list(Counter(list_of_n).items())

请注意,这两种方法只需要列表的一次迭代。您的版本可能会修改为:

occurance_of_n = list(set((n, list_of_n.count(n)) for n in set(list_of_n)))
# [(6, 1), (3, 1), (5, 3), (2, 2)]

但重复调用list.count会对每个(唯一)元素进行初始列表的完整迭代。