应用排序后从列表中提取重复项

时间:2019-04-17 05:01:06

标签: python list duplicates

我正在研究代码段,以从列表中提取重复项。我在此站点上看到了几种实现/解决方案。但是,我无法正确理解这一行-我认为在语法上比较明智。排序后,将index(x)与index(x + 1)进行比较。如果已添加到集合中。

print(set([i for i in a if (a[i] == a[i+1]))

a = [1,2,3,2,1,5,6,5,5,5]
print(a)
print(set(sorted(a)))
# l1[i] == l1[i+1]
print(set([i for i in a if (a[i] == a[i+1]))
print(set([i for i in a if sum([1 for item in a if item == i]) > 1]))

预期结果:{1、2、5}

4 个答案:

答案 0 :(得分:5)

您可以使用collections.Counter

from collections import Counter

a = [1,2,3,2,1,5,6,5,5,5]
c = Counter(a)

res = [n for n, m in c.items() if m > 1]
print(res)  # [1, 2, 5]

通过这种方式,您可以遍历列表一次,并且只能遍历柜台。

答案 1 :(得分:2)

据我所知,您正在尝试实现此逻辑,此代码以O(nlogn)时间复杂度运行,而与counter一起运行的代码以O(n)时间复杂度运行意味着它更快,更干净。

a = [1,2,3,2,1,5,6,5,5,5]
a.sort()
print(set([a[i] for i in range(len(a)-1) if (a[i] == a[i+1])]) )

输出

set([1, 2, 5])

答案 2 :(得分:1)

相反呢?

a = [1,2,3,2,1,5,6,5,5,5]
duplicates = set(element for element in a if a.count(element) > 1)
print(duplicates)

输出:

{1, 2, 5}

答案 3 :(得分:0)

建议从列表中查找重复项的简单解决方案。

>>> a = [1,2,3,2,1,5,6,5,5,5]
>>> a.sort()
>>> set([x for x in a if a.count(x) > 1])

输出:{1, 2, 5}