我正在使用Python 2.7。
假设我有一个这样的列表:
string_list = ['hello', 'apple', 'green', 'paint', 'sting']
列表中的每个字符串长度相同。
我想创建一个类似于以下代码的生成器:
for i in xrange(len(string_list)):
my_gen = (ch for a_string[i] in string_list)
所以第一次运行时,my_gen会有'h','a','g','p',s'。下一次运行它会有'e','p','r','a','t'。
答案 0 :(得分:8)
只需使用内置函数zip
-
喜欢
for letters in zip('hello', 'apple', 'green', 'paint', 'sting'):
print letters
zip是一个内置的,它可以做到这一点:每次迭代时,在元组中组合每个iterable的一个元素。
运行上面的例子,你有:
>>> for letters in zip('hello', 'apple', 'green', 'paint', 'sting'):
... print letters
...
('h', 'a', 'g', 'p', 's')
('e', 'p', 'r', 'a', 't')
('l', 'p', 'e', 'i', 'i')
('l', 'l', 'e', 'n', 'n')
('o', 'e', 'n', 't', 'g')
答案 1 :(得分:2)
izip
完全符合您的要求:
from itertools import izip
for letters in izip(*string_list):
print letters
*
运算符会解压缩您的string_list
,以便izip
将其视为五个字符序列,而不只是一个字符串列表。
输出:
('h', 'a', 'g', 'p', 's')
('e', 'p', 'r', 'a', 't')
('l', 'p', 'e', 'i', 'i')
('l', 'l', 'e', 'n', 'n')
('o', 'e', 'n', 't', 'g')
内置的zip
函数也可以工作,但它不是懒惰的(即它会立即返回所有元组的列表,而不是一次生成一个元组)。
答案 2 :(得分:1)
以下食谱来自itertools documentation:
from itertools import islice, cycle
def roundrobin(*iterables):
"roundrobin('ABC', 'D', 'EF') --> A D E B F C"
# Recipe credited to George Sakkis
pending = len(iterables)
nexts = cycle(iter(it).next for it in iterables)
while pending:
try:
for next in nexts:
yield next()
except StopIteration:
pending -= 1
nexts = cycle(islice(nexts, pending))
除了非常快,这种方法的一个优点是,如果输入迭代的长度不同,它的效果很好。
答案 3 :(得分:0)
使用带有多个列表(iterables)的zip
函数并生成相应项的元组:
zip(*string_list)
产量(连续)
[('h', 'a', 'g', 'p', 's'),
('e', 'p', 'r', 'a', 't'),
('l', 'p', 'e', 'i', 'i'),
('l', 'l', 'e', 'n', 'n'),
('o', 'e', 'n', 't', 'g')]
答案 4 :(得分:0)
val = zip('hello','apple','green','paint','sting')
或zip(*string_list)
print val[0]
output = ('h', 'a', 'g', 'p', 's')
print val[1]
output = ('e', 'p', 'r', 'a', 't')
答案 5 :(得分:0)
def foo(string_list):
for i in xrange(len(string_list)):
yield (a_string[i] for a_string in string_list)
string_list = ['hello', 'apple', 'green', 'paint', 'sting']
for nth_string_list in foo(string_list):
for ch in nth_string_list:
print ch