Использование append () для временных анонимных списков внутри понимания списка в Python - PullRequest
2 голосов
/ 16 ноября 2011

У меня есть вложенный список, который выглядит следующим образом:

mylist = [['A;B', 'C'], ['D;E', 'F']]

Я бы хотел получить его в следующей форме:

[['A', 'B', 'C'], ['D', 'E', 'F']]

Я решил написать простое понимание списка, чтобы выполнить задачу:

>>> newlist = [item[0].split(';').append(item[1]) for item in mylist]
>>> newlist
[None, None]

После некоторых экспериментов я обнаружил, что ошибка была при попытке использовать append() в анонимных списках:

>>> type(['A', 'B'])
<class 'list'>
>>> type(['A', 'B'].append('C'))
<class 'NoneType'>

Что похоже на гочу, учитывая, что вы можете делать такие вещи:

>>> 'abc'.upper()
'ABC'

Очевидно, что в большинстве случаев вы могли бы обойти это, связав ['A', 'B'] с переменной перед вызовом append(), но как бы я сделал это внутри понимания списка? Кроме того, кто-нибудь может объяснить это не интуитивное поведение?

Ответы [ 4 ]

4 голосов
/ 16 ноября 2011
[a.split(';') + [b] for a, b in mylist]
2 голосов
/ 16 ноября 2011

Проблема в том, что вы сохраняете возвращаемое значение метода append(), которое равно None.

. Одним из решений является использование itertools.chain() и сохранение его в списке, например:1006 *

import itertools
mylist = [['A;B', 'C'], ['D;E', 'F']]
newlist = [list(itertools.chain(item[0].split(';'),item[1])) for item in mylist]
print newlist

отпечатков:

[['A', 'B', 'C'], ['D', 'E', 'F']]
1 голос
/ 16 ноября 2011

Как вы узнали, методы мутации не очень полезны для понимания списка, потому что временные объекты исчезают немедленно.

Вместо этого работает построение списка путем конкатенации:

>>> mylist = [['A;B', 'C'], ['D;E', 'F']]
>>> [first.split(';') + [second] for first, second in mylist]
[['A', 'B', 'C'], ['D', 'E', 'F']]
0 голосов
/ 16 ноября 2011

Как будет упомянуто, результат append() будет None, и вы действительно хотите получить результирующий список. Вот один из вариантов:

>>> mylist = [['A;B', 'C'], ['D;E', 'F']]
>>> mylist = [item[0].split(';') + [item[1]] for item in mylist]
>>> mylist
[['A', 'B', 'C'], ['D', 'E', 'F']]
...