Побочный эффект приведения к списку?

У меня есть список (x, y) кортежей ("lt" в примере ниже). Я хочу извлечь x и y, чтобы выполнить расчет корреляции Пирсона. Если я выполню этот код:

lt = [(1,2), (3,4), (5,6)]
print(lt)
unzip_list = zip(*lt)
xs = list(unzip_list)[0]
print(xs)

Как и ожидалось, я получаю такой результат:

[(1, 2), (3, 4), (5, 6)]
(1, 3, 5)

Если я выполню этот код:

lt = [(1,2), (3,4), (5,6)]
print(lt)
unzip_list = zip(*lt)
ys = list(unzip_list)[1]
print(ys)

Как и ожидалось, я получаю такой результат:

[(1, 2), (3, 4), (5, 6)]
(2, 4, 6)

Но если я выполню этот код:

lt = [(1,2), (3,4), (5,6)]
print(lt)
unzip_list = zip(*lt)
xs = list(unzip_list)[0]
print(xs)
ys = list(unzip_list)[1]
print(ys)

Я получаю эту ошибку в строке 6!

[(1, 2), (3, 4), (5, 6)]
(1, 3, 5)

---------------------------------------------------------------------------
IndexError                                Traceback (most recent call last)
<ipython-input-302-81d917cf4b2d> in <module>()
      4 xs = list(unzip_list)[0]
      5 print(xs)
----> 6 ys = list(unzip_list)[1]
      7 print(ys)

IndexError: list index out of range

person JGV    schedule 23.12.2018    source источник


Ответы (1)


zip возвращает итератор, поэтому, как только вы вызываете list, он становится пустым

Python 3.6.7 (default, Oct 22 2018, 11:32:17) 
[GCC 8.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> zip([1], [1])
<zip object at 0x7fcd991991c8>
>>> a = zip([1], [1])
>>> list(a)
[(1, 1)]
>>> list(a)
[]

Вы можете использовать tee для получения более одного итератора:

>>> from itertools import tee
>>> a, b = tee(zip([1], [1]), 2)
>>> list(a)
[(1, 1)]
>>> list(b)
[(1, 1)]
>>> list(a)
[]
>>> list(b)
[]
person Paweł Kordowski    schedule 23.12.2018