我有一个包含重复元素的列表:
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
的价值。
答案 0 :(得分:57)
仅供参考,在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]
找到超过1次的物品
>>> [i for i in y if y[i]>1]
[2, 5]
只找到一次的商品
>>> [i for i in y if y[i]==1]
[1, 3, 6, 7]
答案 1 :(得分:24)
使用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)
或者dict,如果你想追踪重复的位置(也是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"
答案 2 :(得分:16)
你总是可以使用列表理解:
dups = [x for x in list_a if list_a.count(x) > 1]
答案 3 :(得分:8)
在Python 2.3之前,使用dict():
>>> lst = [1, 2, 3, 5, 6, 7, 5, 2]
>>> stats = {}
>>> for x in lst : # count occurrences of each letter:
... stats[x] = stats.get(x, 0) + 1
>>> print stats
{1: 1, 2: 2, 3: 1, 5: 2, 6: 1, 7: 1} # filter letters appearing more than once:
>>> duplicates = [dup for (dup, i) in stats.items() if i > 1]
>>> print duplicates
这是一个功能:
def getDuplicates(iterable):
"""
Take an iterable and return a generator yielding its duplicate items.
Items must be hashable.
e.g :
>>> sorted(list(getDuplicates([1, 2, 3, 5, 6, 7, 5, 2])))
[2, 5]
"""
stats = {}
for x in iterable :
stats[x] = stats.get(x, 0) + 1
return (dup for (dup, i) in stats.items() if i > 1)
使用Python 2.3来自set(),它甚至是内置的:
def getDuplicates(iterable):
"""
Take an iterable and return a generator yielding its duplicate items.
Items must be hashable.
e.g :
>>> sorted(list(getDuplicates([1, 2, 3, 5, 6, 7, 5, 2])))
[2, 5]
"""
try: # try using built-in set
found = set()
except NameError: # fallback on the sets module
from sets import Set
found = Set()
for x in iterable:
if x in found : # set is a collection that can't contain duplicate
yield x
found.add(x) # duplicate won't be added anyway
使用Python 2.7及更高版本,你有 collections
模块提供与dict 完全相同的功能,我们可以缩短它(更快,它可能是C下的引擎盖)比解决方案1:
import collections
def getDuplicates(iterable):
"""
Take an iterable and return a generator yielding its duplicate items.
Items must be hashable.
e.g :
>>> sorted(list(getDuplicates([1, 2, 3, 5, 6, 7, 5, 2])))
[2, 5]
"""
return (dup for (dup, i) in collections.counter(iterable).items() if i > 1)
我坚持使用解决方案2.
答案 4 :(得分:6)
def get_duplicates(arr):
dup_arr = arr[:]
for i in set(arr):
dup_arr.remove(i)
return list(set(dup_arr))
print get_duplicates([1,2,3,5,6,7,5,2])
[2, 5]
print get_duplicates([1,2,1,3,4,5,4,4,6,7,8,2])
[1, 2, 4]
答案 5 :(得分:3)
如果您正在寻找嵌套循环和Python之间的一对一映射,这就是您想要的:
n = len(list_a)
for i in range(n):
for j in range(i+1, n):
if list_a[i] == list_a[j]:
print list_a[i]
上面的代码不是“Pythonic”。我会做这样的事情:
seen = set()
for i in list_a:
if i in seen:
print i
else:
seen.add(i)
此外,请勿使用__contains__
,而应使用in
(如上所述)。
答案 6 :(得分:2)
以下要求列表中的元素可以清除(不仅仅是实现__eq__
)。
我发现使用defaultdict更加pythonic(并且你有免费的重复次数):
import collections l = [1, 2, 4, 1, 3, 3] d = collections.defaultdict(int) for x in l: d[x] += 1 print [k for k, v in d.iteritems() if v > 1] # prints [1, 3]
答案 7 :(得分:2)
仅使用itertools,并在Python 2.5上正常工作
from itertools import groupby
list_a = sorted([1, 2, 3, 5, 6, 7, 5, 2])
result = dict([(r, len(list(grp))) for r, grp in groupby(list_a)])
结果:
{1: 1, 2: 2, 3: 1, 5: 2, 6: 1, 7: 1}
答案 8 :(得分:1)
看起来您有一个列表(list_a
)可能包含重复项,您希望保留原样,并根据list_a构建重复数据删除列表tmp
。在Python 2.7中,您可以使用一行来完成此任务:
tmp = list(set(list_a))
此时比较tmp
和list_a
的长度应说明list_a
中是否确实存在重复项目。如果您想进入循环以进行其他处理,这可能有助于简化操作。
答案 9 :(得分:0)
使用循环,条件逻辑,逻辑运算符和列表方法在列表中查找重复项
some_list = ['a','b','c','d','e','b','n','n','c','c','h',]
duplicates = []
for values in some_list:
if some_list.count(values) > 1:
if values not in duplicates:
duplicates.append(values)
print("Duplicate Values are : ",duplicates)
答案 10 :(得分:0)
您可以使用:
b=['E', 'P', 'P', 'E', 'O', 'E']
c={}
for i in b:
value=0
for j in b:
if(i == j):
value+=1
c[i]=value
print(c)
输出:
{'E': 3, 'P': 2, 'O': 1}
答案 11 :(得分:0)
Granted, I haven't done tests, but I guess it's going to be hard to beat pandas in speed:
pd.DataFrame(list_a, columns=["x"]).groupby('x').size().to_dict()
答案 12 :(得分:0)
如果是Python3,如果你有两个列表
def removedup(List1,List2):
List1_copy = List1[:]
for i in List1_copy:
if i in List2:
List1.remove(i)
List1 = [4,5,6,7]
List2 = [6,7,8,9]
removedup(List1,List2)
print (List1)
答案 13 :(得分:0)
快速又脏,
list_a=[1,2,3,5,6,7,5,2]
holding_list=[]
for x in list_a:
if x in holding_list:
pass
else:
holding_list.append(x)
print holding_list
答案 14 :(得分:0)
使用numpy:
import numpy as np
count,value = np.histogram(list_a,bins=np.hstack((np.unique(list_a),np.inf)))
print 'duplicate value(s) in list_a: ' + ', '.join([str(v) for v in value[count>1]])
答案 15 :(得分:0)
你可以逐行“翻译”它。
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 range(0, len(list_a)):
for j in range(i + 1, len(list_a))
if list_a[i] == list_a[j]:
print list_a[i]
c ++ for loop:
for(int x = start; x < end; ++x)
Python等价物:
for x in range(start, end):
答案 16 :(得分:-2)
更多Pythonic实现(当然不是最多),但是在C代码的精神上可能是:
for i, elem in enumerate(seq):
if elem in seq[i+1:]:
print elem
编辑:是的,如果重复次数超过2次,它会多次打印元素,但这也是op的C伪代码所做的。