.remove () удаляет элементы из обеих переменных (списков) (которые я устанавливаю равными друг другу), когда я хочу удалить его только из одной переменной - PullRequest
0 голосов
/ 19 сентября 2019

У меня есть список с именем ranks и список с именем modelRanks, они равны.Когда я перебираю цикл for, я хочу удалить из modelRanks что-либо, имеющее счет 2 или более в ranks.Я использовал функцию remove, и он удаляет элемент из обоих при вызове, чтобы удалить только из modelRanks.

Я также пытался modelRanks = modelRanks.remove(num) и modelRanks -= [num]

Это мой код в настоящее время.Я использую python 3.7.

def modelForPairs(ranks):

    modelRanks = ranks

    for num in ranks:
        count = ranks.count(num)

        if count > 1:
            modelRanks.remove(num)

    return modelRanks

Если мой список рангов равен [11, 2, 3, 11, 3], я хочу, чтобы мой modelRanks в конечном итоге выглядел как [2].Если ranks = [2, 4, 3, 11, 3] я хочу, чтобы modelRanks в конечном итоге выглядел как [2, 4, 11] и т. Д.

Ответы [ 5 ]

1 голос
/ 19 сентября 2019

или просто используйте Counter:

from collections import Counter

c = Counter(ranks)
modelRanks = list(item for item, count in c.items() if count == 1)
1 голос
/ 19 сентября 2019

В вашем коде просто измените строку modelRanks = ranks на modelRanks = ranks.copy().

В Python установка переменной, равной списку, просто указывает на этот объект списка;он не создает копию по умолчанию.Например:

lst = [1, 2, 3]
lst2 = lst
lst2.remove(2)
print(lst2)
# [1, 3]
print(lst)
# [1, 3]
# They're the same object!

Вы можете обойти это, явно позвонив lst.copy() или lst[:] ( см. Документы ).Оба они выполняют так называемую мелкую копию .

lst = [1, 2, 3]
lst2 = lst.copy()  # or lst2 = lst[:]
lst2.remove(2)
print(lst2)
# [1, 3]
print(lst)
# [1, 2, 3]
# Different objects!

Заметка о мелкой против глубоких копий (потому что я вижумного доказательств того, что есть некоторая путаница в этом вопросе).Из документов :

Разница между мелким и глубоким копированием относится только к составным объектам (объектам, которые содержат другие объекты, например списки или экземпляры классов):

  • Мелкая копия создает новый составной объект, а затем (по мере возможности) вставляет в него ссылки на объекты, найденные в оригинале.

  • Глубокаяcopy создает новый составной объект, а затем рекурсивно вставляет в него копии объектов, найденных в оригинале.

В основном, если ваш список содержит другие объекты и вам явно требуетсячтобы не просто указывать на такие же объекты в списке new , тогда и только тогда вам нужно использовать глубокую копию.Мелкая копия заполнит новый список 1044 * указателями на те же объекты *1045*.Удаление элементов из этого списка никак не повлияет на исходные объекты, а только удалит их из нового списка.

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

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

0 голосов
/ 19 сентября 2019

Итак, что здесь происходит, когда вы устанавливаете два списка равными друг другу, вы копируете ссылку первой переменной на вторую.

Вот что я имею в виду:
Предположим массивназначен на a.Когда мы пишем выражение b = a, b указывает на тот же массив, что и a.Таким образом, диаграмма для этого может выглядеть следующим образом:
Diagram
Это означает, что, если a изменится, то b также изменится.Таким образом, мы должны создать копию списка a, если мы не хотим изменять b с помощью метода a.copy().

0 голосов
/ 19 сентября 2019

В первой строке: (modelRanks = ranks) вы делаете мелкую копию.Это означает, что обе переменные указывают на одно и то же место в памяти.Таким образом, когда вы изменяете одну переменную, изменение также видно через вторую переменную.

Для создания глубокой копии списка используйте copy.deepcopy (...) , и ваша вторая переменная будет иметь собственную памятьпространство.

0 голосов
/ 19 сентября 2019

Используйте глубокую копию при инициализации:

Замените

modelRanks = ranks

на

modelRanks = copy.deepcopy(ranks) 

Также import copy перед запуском модуля.

...