29 Stimmen

Wie doppelte Elemente in Array mit for-Schleife in Python zu finden?

Ich habe eine Liste mit doppelten Elementen:

 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)

Ich habe den obigen Code verwendet, um die doppelten Elemente in der list_a . Ich möchte die Elemente nicht aus der Liste entfernen.

Aber ich möchte hier eine for-Schleife verwenden. Normalerweise C/C++ wir verwenden wie diese ich denke:

 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]

wie kann man das in Python verwenden?

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

Ich habe den obigen Code ausprobiert. Aber er liefert die falsche Lösung. Ich weiß nicht, wie ich den Wert für j .

66voto

YOU Punkte 113320

Nur zur Information, in Python 2.7+ können wir Counter verwenden

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})

Einzigartige Liste

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

Mehr als 1 Mal gefundene Artikel

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

Nur einmal gefundene Gegenstände

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

27voto

Verwenden Sie die in Operator statt des Aufrufs __contains__ direkt.

Was Sie haben, funktioniert fast (ist aber 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]

Aber es ist viel einfacher, eine Menge zu verwenden (ungefähr O(n) aufgrund der Hashtabelle):

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

Oder ein Diktat, wenn Sie die Positionen von Duplikaten verfolgen wollen (auch 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

Oder auch nur irgendwo ein Duplikat entdecken (auch O(n)):

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

20voto

Evan Fosmark Punkte 93825

Sie können immer ein Listenverständnis verwenden:

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

8voto

e-satis Punkte 547539

Vor Python 2.3 wird dict() verwendet:

>>> 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

Also eine Funktion :

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)

Mit Python 2.3 kommt set(), und es ist sogar eine eingebaute nach als :

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

Mit Python 2.7 und höher haben Sie die collections Modul, das die gleiche Funktion wie das diktierte Modul hat und wir können es kürzer (und schneller, es ist wahrscheinlich C unter der Haube) als Lösung 1 machen:

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)

Ich würde bei Lösung 2 bleiben.

7voto

ASKN Punkte 356

Sie können diese Funktion verwenden, um Duplikate zu finden:

def get_duplicates(arr):
    dup_arr = arr[:]
    for i in set(arr):
        dup_arr.remove(i)       
    return list(set(dup_arr))

Beispiele

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]

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X