использование zip-объекта в петле for-loop - PullRequest
0 голосов
/ 29 марта 2019

Доступен ли zip-объект для использования в цикле for только в качестве самого объекта?

Хотелось бы получить некоторое объяснение, почему другие типы (такие как переменная, список) не могут использоваться, когда онна самом деле то же самое.

x = [1, 2, 3]
y = ['a', 'b', 'c']
​
obj1 = zip(x, y)
odj2 = list(zip(x, y))

​# working properly
for a, b in zip(x, y):
    print(a)
    print(b)     

# doesn't work and don't know why
for a, b in obj1:
    print(a)
    print(b)     

for a, b in obj2:
    print(a)
    print(b)  

так, мне нужно использовать сам объект zip с функцией zip в цикле for?

Заранее большое спасибо!

1 Ответ

0 голосов
/ 29 марта 2019

Если вы запускаете предоставленный код с самого начала, он работает (за исключением того, что odj2 должно быть obj2).

Причина вашей путаницы в том, что объект zip является итератором . Он не хранит элементы в памяти, а генерирует их на лету по мере необходимости. Вы не можете получить доступ к предыдущим элементам или перезапустить итератор; вместо этого вы должны построить новый. Поэтому, если вам нужно будет повторять такие последовательности более одного раза, вам следует преобразовать их в постоянные структуры данных, такие как lists. Например:

x = [1, 2, 3]
y = ['a', 'b', 'c']

zip_object = zip(x, y)

print('first time:')

for first, second in zip_object:
    print(first, second)

print('second time:')

for first, second in zip_object:
    print(first, second)

print('done')

Выход:

first time
1 a
2 b
3 c
second time
done

Сравните это с тем случаем, когда вы используете объект zip для создания list:

zip_object = zip(x, y)
new_list = list(zip_object)

print('first time:')

for first, second in new_list:
    print(first, second)

print('second time:')

for first, second in new_list:
    print(first, second)

print('going back to the zip object')

for first, second in zip_object:
    print(first, second)

print('done')

Выход:

first time
1 a
2 b
3 c
second time
1 a
2 b
3 c
going back to the zip object
done

Произошло то, что вы перебрали где-то obj1, а затем, не создав новый объект zip, попытались повторить его снова. Поскольку он уже был полностью исчерпан, цикл for не мог повторяться.

...