如何在Python中使用for循环查找数组中的重复元素?

29 投票
20 回答
94264 浏览
提问于 2025-04-15 17:07

我有一个包含重复元素的列表:

 list_a=[1,2,3,5,6,7,5,2]

 tmp=[]

 for i in list_a:
     if tmp.__contains__(i):
         print i
     else:
         tmp.append(i)

我用上面的代码来找出 list_a 中的重复元素。我并不想从列表中删除这些元素。

但是我想在这里使用 for 循环。通常在 C/C++ 中我们是这样用的,我想:

 for (int i=0;i<=list_a.length;i++)
     for (int j=i+1;j<=list_a.length;j++)
         if (list_a[i]==list_a[j])
             print list_a[i]

那在 Python 中我们怎么用呢?

for i in list_a:
    for j in list_a[1:]:
    ....

我试过上面的代码,但结果不对。我不知道怎么增加 j 的值。

20 个回答

20

你可以使用列表推导式来实现这个功能:

dups = [x for x in list_a if list_a.count(x) > 1]
27

使用 in 操作符,而不是直接调用 __contains__

你现在的做法差不多可以用,但效率是 O(n**2),也就是随着数据量增加,速度会变得很慢:

for i in xrange(len(list_a)):
  for j in xrange(i + 1, len(list_a)):
    if list_a[i] == list_a[j]:
      print "duplicate:", list_a[i]

不过,使用集合会简单得多(大约是 O(n),因为它使用了哈希表):

seen = set()
for n in list_a:
  if n in seen:
    print "duplicate:", n
  else:
    seen.add(n)

如果你想跟踪重复项的位置,可以使用字典(同样是 O(n)):

import collections
items = collections.defaultdict(list)
for i, item in enumerate(list_a):
  items[item].append(i)
for item, locs in items.iteritems():
  if len(locs) > 1:
    print "duplicates of", item, "at", locs

或者你只想检测某个地方是否有重复项(也是 O(n)):

if len(set(list_a)) != len(list_a):
  print "duplicate"
66

仅供参考,在Python 2.7及以上版本中,我们可以使用Counter这个工具。

import collections

x=[1, 2, 3, 5, 6, 7, 5, 2]

>>> x
[1, 2, 3, 5, 6, 7, 5, 2]

>>> y=collections.Counter(x)
>>> y
Counter({2: 2, 5: 2, 1: 1, 3: 1, 6: 1, 7: 1})

独特的列表

>>> list(y)
[1, 2, 3, 5, 6, 7]

出现超过一次的项目

>>> [i for i in y if y[i]>1]
[2, 5]

只出现一次的项目

>>> [i for i in y if y[i]==1]
[1, 3, 6, 7]

撰写回答