如何在Python中使用for循环查找数组中的重复元素?
我有一个包含重复元素的列表:
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]