[python] 查找列表中重复的元素

已有列表:

a = [1, 2, 3, 2, 1, 5, 6, 5, 5, 5]

写法1:

import collections
print([item for item, count in collections.Counter(a).items() if count > 1])
## [1, 2, 5]

但是 Counter 效率不高,写法2:

seen = set()
uniq = []
for x in a:
    if x not in seen:
        uniq.append(x)
        seen.add(x)

但是上面的code,结果不对,我改成了下面这样:

seen = set()
duplicated = set()
for x in a:  
    if x not in seen:  
        seen.add(x)
    else:
        duplicated.add(x)
print(duplicated)  # {1, 2, 5}

第3种写法比第2种写法更为紧凑,但这种写法不那么直观:

seen = set()
uniq = [x for x in a if x not in seen and not seen.add(x)]  # 这种写法,结果也不对

我自己的写法:

a = [1, 2, 3, 2, 1, 5, 6, 5, 5, 5]
b = set(a)
for each_b in b:
    count = 0
    for each_a in a:
        if each_b == each_a:
            count += 1
    print(each_b, ": ", count)

运行如下:
1 :  2
2 :  2
3 :  1
5 :  4
6 :  1

或者这样写:

a = [1, 2, 3, 2, 1, 5, 6, 5, 5, 5]
duplicated = set()  
for i in range(0, len(a)):
    if a[i] in a[i+1:]:
        duplicated.add(a[i])
print(duplicated)
# {1, 2, 5}

用下面的函数还可以列出重复元素的索引:

a = [1, 2, 3, 2, 1, 5, 6, 5, 5, 5]
source = a
from collections import defaultdict
def list_duplicates(seq):
    tally = defaultdict(list)
    for i,item in enumerate(seq):
        tally[item].append(i)
    return ((key,locs) for key,locs in tally.items() 
                            if len(locs)>1)

for dup in sorted(list_duplicates(source)):
    print(dup)

输出如下:
(1, [0, 4])
(2, [1, 3])
(5, [5, 7, 8, 9])

Index of duplicates items in a python list

如何在一个列表中查找重复的元素并创建新的列表

  • 15
    点赞
  • 82
    收藏
    觉得还不错? 一键收藏
  • 8
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值