Python: дубликаты в списке - PullRequest
0 голосов
/ 03 октября 2019

Я пытаюсь создать новый список уникальных значений и удалить указанные значения из исходного списка, чтобы осталось только дубликаты. Похоже, мой цикл for пропускает значения.

array = [1,3,4,2,2,3,4]
def duplicates(array):
    mylist = []
    for item in array:
        if item not in mylist:
            mylist.append(item)
            array.remove(item)
    return mylist

результаты:

дубликаты (массив)

[1, 4, 2]

Ответы [ 6 ]

1 голос
/ 03 октября 2019

Проблема связана с array.remove(item), он удаляет элемент в посещенной позиции индекса. Таким образом, номер индекса уменьшается на единицу и делает цикл, чтобы пропустить чтение следующего значения.

[1, 3, 4, 2, 2, 3, 4] -> до 1-й итерации индекса 0 -> значение = 1

[3, 4, 2, 2, 3, 4] ->После удаления 1-й итерации 1 индекс 0 -> значение = 3 (цикл не читает его, поскольку он уже читает индекс 0, поэтому цикл читает индекс 1 -> значение 4)

Исправьте код для отображения значений бездубликаты:

array = [1,3,4,2,2,3,4]

def duplicates(array):
    mylist = []
    for item in array:
        if item not in mylist:
            mylist.append(item)
            #array.remove(item)
    return mylist

res=duplicates(array)
print (res)
1 голос
/ 03 октября 2019

Я думаю, что использование collections.Counter более подходит для этой задачи:

array = [1, 3, 4, 2, 2, 3, 4]

from collections import Counter

def duplicates(array):
  return [n for n, c in Counter(array).items() if c > 1]

print(duplicates(array))

Вывод:

[3, 4, 2]
0 голосов
/ 05 октября 2019

Немного неясно, какой результат вы ожидаете. Если вы хотите получить все уникальные значения при сохранении порядка вхождения, каноническим способом достижения этого будет использование collections.OrderedDict:

from collections import OrderedDict

def duplicates(array):
    return list(OrderedDict.fromkeys(array))

>>> duplicates(array)
[1, 3, 4, 2]

Если вы хотите получить список только из дубликатов, то есть значений, которые встречаются более одного раза, вы можете использовать collections.Counter:

from collections import Counter

def duplicates(array):
    return [k for k, v in Counter(array).items() if v > 1]

>>> duplicates(array)
[3, 4, 2]
0 голосов
/ 03 октября 2019
array = [1,3,4,2,2,3,4]
def duplicates(array):
    mylist = []
    for item in array:
        if item not in mylist:
            mylist.append(item)
            array.remove(item)
        else:
            array.remove(item)
    return mylist

просто удалите элемент, который вы не добавляете

0 голосов
/ 03 октября 2019

Вам не нужно использовать цикл, гораздо понятнее использовать понимание списка

dups = list(set([l for l in array if array.count(l) > 1]))

Однако ответ, предоставленный kuco 23, делает это соответствующим образом с циклом,

0 голосов
/ 03 октября 2019

Вы удаляете значения из списка, по которому вы перебираете, поэтому ваш цикл пропускает значения, попробуйте это

array = [1,3,4,2,2,3,4]
def duplicates(array):
    mylist = []
    for i, item in enumerate(array):
        if item not in mylist:
            mylist.append(item)
            array[i] = None

    array[:] = list(filter(
        lambda x: x is not None,
        array
    ))

    return mylist

Хотя вы должны уточнить, что вы хотите сделать с переменной массива, поскольку в настоящее время неясно.

...