在Python中,是否可以解压缩字符串列表并将每个字符串中的单个字符放入生成器中?

在Python中,是否可以解压缩字符串列表并将每个字符串中的单个字符放入生成器中?,python,Python,我正在使用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) 因此,第一次运行时,我的_gen将有“h”、“a”、“g”、“p”、“s”。下一

我正在使用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)

因此,第一次运行时,我的_gen将有“h”、“a”、“g”、“p”、“s”。下一次运行时,它将有“e”、“p”、“r”、“a”、“t”。

只需使用内置函数
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')

使用
zip
函数获取多个列表(iterables)并生成相应项的元组:

zip(*string_list)
产量(连续)

zip(*字符串列表)

输出=
('h','a','g','p','s')


输出=
('e'、'p'、'r'、'a'、't')
izip
正是您想要的:

from itertools import izip
for letters in izip(*string_list):
    print letters
*
操作符将您的
字符串列表
解压,以便
izip
将其视为五个字符序列,而不仅仅是一个字符串列表。
输出:


内置的
zip
函数也可以工作,但它不是惰性的(即,它立即返回所有元组的列表,而不是一次生成一个元组)。

以下配方来自:


除了速度非常快之外,这种方法的一个优点是,如果输入iterables的长度不同,它也能很好地工作。

字符串已经是iterable,因此无需将它们转换为列表只要所有输入的长度相同,zip()函数就可以工作。如果没有,请参阅下面的roundrobin()配方。对于同一问题,这是一个更通用的解决方案。
val = zip('hello','apple','green','paint','sting')
print val[0]
print val[1]
from itertools import izip
for letters in izip(*string_list):
    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')
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
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))