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

时间:2012-01-18 02:07:18

标签: 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)

所以第一次运行时,my_gen会有'h','a','g','p',s'。下一次运行它会有'e','p','r','a','t'。

6 个答案:

答案 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