Могу ли я изменить список условно? - PullRequest
0 голосов
/ 25 мая 2019

Возможно, на этот вопрос уже дан ответ, но я не смог найти его в своем поиске.

В Python 3 я пишу код, который выглядит примерно так:

def func():
    for item in list_A:
        if item == 'duck': list_B.append(0)
        elif item == 'goose': list_B.append(1)
        else: list_B.append(item)
    list_A = list_B

Мое намерение состоит в том, чтобы изменить значения в list_A условно. Например:

list_A = ['duck', 'duck', 'goose', 'duck', 'chicken']
func(list_A) -> [0, 0, 1, 0, 'chicken']

В идеале я хотел бы сделать это без создания второго списка. Я хотел бы найти что-то вроде следующего псевдо-кода:

list_A = [(if item == 'duck': 0, elif item == 'goose': 1, else: item) for item in list_A]

Я догадываюсь, что вышеприведенное не сработает, потому что вы не можете изменить список во время итерации по нему (?), Но если у кого-то есть что-то лучше, чем мой оригинальный метод, мне было бы очень интересно узнать об этом. Спасибо!

Ответы [ 4 ]

8 голосов
/ 25 мая 2019

Это нормально, чтобы заменить элементы в списке во время итерации.Проблема заключается в структурной модификации - операциях, которые добавляют элементы, удаляют их или иным образом приводят к смещению элементов.

При этом создание второго списка обычно легче получить правильно, иЧасто быстрее

1 голос
/ 25 мая 2019
def func(list_a):
  dict_a = {"duck":0,"goose":1}
  return [dict_a.get(item,item) for item in list_a]
0 голосов
/ 25 мая 2019
def func():
    list_A=['duck','dd']
    list_B=[]   
    dic = {'duck':0,'goose':1}
    for item in list_A:
        list_B.append(dic[item]) if item in dic  else list_B.append(item)

    print(list_B)

print(func())

выход

[0, 'dd']
0 голосов
/ 25 мая 2019

Вы можете создать dict, а затем использовать его для своего отображения. В этом случае можно изменять список, перебирая его, потому что вы а) не меняете элемент, который еще не прочитали, и б) не меняете длину списка. Чтобы сделать код более компактным, вы можете использовать dict.get(), чтобы охватить другой случай:

mapping = {'duck': 0, 'goose': 1}
for i, val in enumerate(list_A):
    list_A[i] = mapping.get(val, val)

или немного быстрее, но немного больше кода:

mapping = {'duck': 0, 'goose': 1}
for i, val in enumerate(list_A):
    if val in mapping:
        list_A[i] = mapping[val]

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

mapping = {'duck': 0, 'goose': 1}
list_B = [mapping.get(val, val) for val in list_A]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...