#python
#python
Вопрос:
Вот мои наборы данных:
R = [["yyy", "3"],["www", "4"],["eee","3"],["zzz", "2"]]
Я пытаюсь добавить один элемент (‘-1’) ко всем подспискам списка (R), чтобы получить новый список (new_R) и сохранить R без изменений:
print(new_R)
output:
[['yyy', '3', '-1'],
['www', '4', '-1'],
['eee', '3', '-1'],
['zzz', '2', '-1']]
print(R)
output:
[["yyy", "3"],["www", "4"],["eee","3"],["zzz", "2"]]
Я пытался:
new_R = [x.append('-1') for x in R]
и
new_R = list(map(lambda x: x.append('-1'), R))
Однако результаты R и new_R не ожидаются:
print(new_R)
output:
[None, None, None, None]
print(R)
output:
[['yyy', '3', '-1'],
['www', '4', '-1'],
['eee', '3', '-1'],
['zzz', '2', '-1']]
Ищу объяснение и решение!
Спасибо!
Комментарии:
1. Вместо
x.append(-1)
того, чтобы попробоватьx [-1]
. Ваши собственные результаты объясняются тем фактом, чтоappend
изменяет список и возвращаетNone
.2. @kaya3 Спасибо за ваше объяснение!
Ответ №1:
append
работает на месте и возвращает None
, поэтому вы этого не хотите (именно поэтому ваши решения создают много None
s в новом list
при изменении оригинала list
). Простейшим решением является просто list
конкатенация, например:
new_R = [x ['-1'] for x in R]
или (с более новым синтаксисом для версии 3.5 и выше и, возможно, меньшим количеством временных файлов) создайте новый list
, распаковав старый плюс дополнительное значение:
new_R = [[*x, '-1'] for x in R]
Комментарии:
1. Примечание: при тестировании на Python 3.8.5 и 3.9.0 (оба x64 для Linux) решение для распаковки было быстрее. Не намного быстрее, всего на ~ 20% меньше времени выполнения. Хотя любой из них подходит; это вряд ли будет вашим узким местом.
2. Почему распаковка списка происходит быстрее, чем объединение здесь?
3. Спасибо! Это действительно полезно!!
4. @JoshuaNixon Я предполагаю, что это позволяет избежать создания временного списка
[-1]
.5. Я всегда предполагал, что распаковка списка будет довольно тяжелой задачей