duplicates list重复元素位置 - 如何在Python中使用for循环在数组中查找重复元素?




list找出重复元素 list中的index (13)

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

 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的值。


Answers

在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相同的功能 ,并且我们可以使它比解决方案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。


看起来你有一个列表( list_a )可能包含重复项,你宁愿保持原样,并基于list_a构建一个去重复列表tmp 。 在Python 2.7中,您可以使用一行来完成此操作:

tmp = list(set(list_a))

此时比较tmplist_a的长度应该说明list_a中是否确实存在重复项。 如果您想进入循环以进行其他处理,这可能有助于简化操作。


使用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"

当然,我还没有做过测试,但我想在速度上很难击败熊猫:

 pd.DataFrame(list_a, columns=["x"]).groupby('x').size().to_dict()

使用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]])

你可以逐行“翻译”它。

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]

蟒蛇

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循环:

for(int x = start; x < end; ++x)

Python等价物:

for x in range(start, end):

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]

以下要求列表中的元素可以清除(不仅仅是实现__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]

仅供参考,在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]

只是快速和肮脏,

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

输出[1,2,3,5,6,7]


如果您正在寻找嵌套循环和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 (如上所述)。


你总是可以使用列表理解:

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

获取列表中一个或多个(相同)项的所有出现次数和位置

使用enumerate(alist),当元素x等于您查找的内容时,您可以存储第一个元素(n),它是列表的索引。

>>> alist = ['foo', 'spam', 'egg', 'foo']
>>> foo_indexes = [n for n,x in enumerate(alist) if x=='foo']
>>> foo_indexes
[0, 3]
>>>

让我们的函数findindex

此函数将项目和列表作为参数,并返回列表中项目的位置,就像我们之前看到的那样。

def indexlist(item2find, list_or_string):
  "Returns all indexes of an item in a list or a string"
  return [n for n,item in enumerate(list_or_string) if item==item2find]

print(indexlist("1", "010101010"))

产量

[1, 3, 5, 7]

简单

for n, i in enumerate([1, 2, 3, 4, 1]):
    if i == 1:
        print(n)

输出:

0
4




python duplicates