首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >应用排序后从列表中提取重复项

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

Stack Overflow用户
提问于 2019-04-17 13:01:06
回答 4查看 72关注 0票数 4

我正在编写代码片段,以便从列表中提取重复项。我在这个网站上看到了几个实现/解决方案。然而,我没有正确地理解这一行--我想是语法上的。排序后,将索引(X)与索引(x+1)进行比较。如果它被添加到集合中。

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

代码语言:javascript
运行
复制
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}

EN

回答 4

Stack Overflow用户

发布于 2019-04-17 13:04:48

您可以使用collections.Counter

代码语言:javascript
运行
复制
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]

通过这种方式,您可以遍历列表一次,并且仅遍历计数器一次。

票数 5
EN

Stack Overflow用户

发布于 2019-04-17 13:20:07

从我收集到的信息来看,你正在尝试实现这个逻辑,这个代码以O(nlogn)时间复杂度运行,而使用计数器运行的代码以O(n)时间复杂度运行,这意味着它更快、更干净。

代码语言:javascript
运行
复制
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])]) )

输出

代码语言:javascript
运行
复制
set([1, 2, 5])
票数 2
EN

Stack Overflow用户

发布于 2019-04-17 13:03:38

不如这样吧?

代码语言:javascript
运行
复制
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)

输出:

代码语言:javascript
运行
复制
{1, 2, 5}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55720233

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档