Как найти дублирующиеся элементы в использовании массива для цикла в Python?

У меня есть список с дублирующимися элементами:

 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. Я не хочу удалять элементы из списка.

Но я хочу использовать для цикла здесь. Обычно 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.

22
задан vaultah 21 February 2016 в 16:36
поделиться

8 ответов

Вы можете просто «перевести» это построчно.

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):
0
ответ дан 29 November 2019 в 03:18
поделиться

Если вы ищете взаимно-однозначное сопоставление между вложенными циклами и 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 __ , а используйте в (как указано выше).

3
ответ дан 29 November 2019 в 03:18
поделиться

Используйте оператор в вместо прямого вызова __ 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"
25
ответ дан 29 November 2019 в 03:18
поделиться

Вы всегда можете использовать понимание списка:

dups = [x for x in list_a if list_a.count(x) > 1]
17
ответ дан 29 November 2019 в 03:18
поделиться

Просто для информации: в 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]
56
ответ дан 29 November 2019 в 03:18
поделиться

Немного больше реализации Pythonic (не самая, конечно), но в духе вашего кода C может быть:

for i, elem in enumerate(seq):
    if elem in seq[i+1:]:
        print elem

Изменить: да, он печатает элементы более одного раза, если повторений больше двух, но это то же самое, что делает псевдокод C.

-2
ответ дан 29 November 2019 в 03:18
поделиться

До 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 one , и мы можем сделать его короче (и быстрее, вероятно, 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.

8
ответ дан 29 November 2019 в 03:18
поделиться

. Для следующих элементов требуется, чтобы элементы вашего списка были хешируемыми (не только реализация __ eq __ ). Я считаю более питоническим использовать defaultdict (и у вас есть количество повторений бесплатно):

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]
2
ответ дан 29 November 2019 в 03:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: