путаница в списке питонов - PullRequest
0 голосов
/ 04 марта 2011

привет, у меня такая ситуация:

>>> def get():
...     for i in range(3):
...             yield [0]
... 

и я хочу получить это: [0,0,0]

мой код теперь работает следующим образом:

>>> r = []
>>> r.extend(i[0] for i in get())
>>> r
[0, 0, 0]

но мне не нравится я [0] .. какой-нибудь совет?

(я на питоне3)

Ответы [ 7 ]

2 голосов
/ 04 марта 2011

Ваш код выглядит очень странно, но я предполагаю, что он очень упрощен. Если это просто избавление от i[0], сделайте это:

>>> def get():
...     for i in range(3):
...             yield 0
... 
>>> r = []
>>> r.extend(get())
>>> r
[0, 0, 0]
1 голос
/ 09 марта 2011

r.extend (i [0] для i в get ())

Этот тип императивного кода (с состоянием, с обновлениями на месте) вызывает проблемы. Это кажется каноническим использованием для функционала flatten ( concat ):

from itertools import chain

def flatten(listOfLists):
    return chain.from_iterable(listOfLists)

def get():
    for i in range(3):
        yield [0]

print(list(flatten(get())))
# [0, 0, 0]
1 голос
/ 05 марта 2011

Причина, по которой вам нужно использовать i[0], заключается в том, что get() - это генератор, который возвращает list размера 1 каждый раз, когда он вызывается. Итак, ваш код i[0] for i in get() такой же, как i[0] for i in ([0],[0],[0]). Причина, по которой ваш код работает, заключается в том, что i[0] получает первый элемент из возвращенного элемента, который сам по себе является list [0].

Из вашего вопроса я понял, что вы хотите получить i for i in [0,0,0]. Как упоминалось в других ответах, это может быть достигнуто путем замены вашего генератора на int 0 вместо list [0]. Вы можете увидеть результат работы генератора в следующем примере кода:

>>> for i in get():
...   print("i={} and i[0]={}".format(i, i[0]))
... 
i=[0] and i[0]=0
i=[0] and i[0]=0
i=[0] and i[0]=0

Как видите, ваш генератор возвращает [0] каждую итерацию, и именно поэтому вы должны использовать i[0], чтобы получить первый элемент каждого списка.

Кроме того, поскольку r - это всего лишь результаты генератора, вы можете упростить это, выполнив следующее:

>>> def gen():
...   for i in range(3):
...     yield 0
... 
>>> r = list(gen())
>>> r
[0, 0, 0]
1 голос
/ 04 марта 2011

Мне кажется, что get может только когда-либо возвращать список длины 1. Если это так, сбросьте скобки:

>>> def get():
...     for i in range(3):
...             yield 0
>>> # Or, shorter ...
>>> get = lambda: (0 for i in range(3))
>>> r = []
>>> r.extend(get())
>>> r
[0, 0, 0]
0 голосов
/ 04 марта 2011

???

def get():
    for i in xrange(3):
        yield 0

r = list(get())

print r

или

gen = (0 for i in xrange(3))

r = list(gen)

print r
0 голосов
/ 04 марта 2011

Вы можете попробовать это вместо:

def get():
    return [0] * 3

r = [] 
r.extend(get())
r
[0, 0, 0]
0 голосов
/ 04 марта 2011

Не возвращайте массив, если он вам не нужен:

>>> def get():
...  for i in range(3):
...   yield 0
... 
>>> r = []
>>> r.extend(i for i in get())
>>> r
[0, 0, 0]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...