2014-11-10 5 views
1

Предположим, у меня есть list_of_numbers = [[1, 2], [3], []], и я хочу гораздо более простой объект списка объектов x = [1, 2, 3].Получите массив из объекта itertools.chain

Следуя логике this related solution, я

list_of_numbers = [[1, 2], [3], []] 
import itertools 
chain = itertools.chain(*list_of_numbers) 

К сожалению, chain не совсем то, что я хочу, потому что (например) работает chain на консоль возвращает <itertools.chain object at 0x7fb535e17790>.

Что такое функция f такой, что если я делаю x = f(chain), а затем введите x на консоли, я получаю [1, 2, 3]?

Обновление: Фактически, в конечном итоге я нуждаюсь в array([1, 2, 3]). Я добавляю строку в комментарии к выбранному ответу, чтобы ответить на это.

+0

почему -1? любые идеи для улучшения вопроса приветствуются. – zkurtz

ответ

3

list. Если вы делаете list(chain), он должен работать. Но используйте это только для целей отладки, это может быть неэффективным вообще.

+0

Как это неэффективно? – zkurtz

+0

После импорта numpy как np, однострочная версия, которую я использую сейчас, такова: 'x = np.array (list (itertools.chain (* list_of_numbers))'. – zkurtz

0

Вы можете сделать это с помощью list(chain).

+0

Это не дает ответа на вопрос. Чтобы критиковать или просить разъяснения у автора, оставьте комментарий ниже их сообщения. – peterh

+0

он не отвечает на вопрос «Что такое функция f, что если я делаю x = f (цепочка), а затем набираю x на консоли, я получаю [1, 2, 3]? ' или оператор заголовка «Получить« простой старый »массив из объекта itertools.chain» – user3684792

3

Если ваша конечная цель состоит в том, чтобы получить массив Numpy, то вы должны использовать numpy.fromiter здесь:

>>> import numpy as np 
>>> from itertools import chain 
>>> list_of_numbers = [[1, 2], [3], []] 
>>> np.fromiter(chain(*list_of_numbers), dtype=int) 
array([1, 2, 3]) 
>>> list_of_numbers = [[1, 2]*1000, [3]*1000, []]*1000 
>>> %timeit np.fromiter(chain(*list_of_numbers), dtype=int) 
10 loops, best of 3: 103 ms per loop 
>>> %timeit np.array(list(chain(*list_of_numbers))) 
1 loops, best of 3: 199 ms per loop 
+0

выглядит многообещающим, хотя я не могу показаться чтобы заставить детали '% timeit' работать. Некоторая синтаксическая ошибка. Сначала я попытался импортировать' timeit', и это не помогло. В общем, я не слежу за вашим сравнением скорости. Вы говорите, что 'numpy.fromiter 'является более быстрым вариантом? Если да, то является ли это основной причиной его предпочтения? – zkurtz

+0

'% timeit' является частью [оболочки IPython] (http://ipython.org/). Конечно, скорость - это одна из причин, .fromiter', плюс нам не нужно создавать промежуточный список здесь. –

Смежные вопросы