Добавление элемента ко всем подспискам списка в Python

#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. Я всегда предполагал, что распаковка списка будет довольно тяжелой задачей