1

假设我有一个清单:

x = ['abc', 'd', 'efgh']

我正在尝试创建一个函数,以便返回所需的输出:

a d e b f c g h

这实质上是获取每个元素的第一个字符,然后如果该区域中没有索引,则跳到下一个元素。

有没有使用 itertools 或 zip 功能的替代方法?

我试着做:

for i in x:
      print(i[0], i[1], i[2]....etc)

但这只会给我一个错误,因为列表的第二个元素超出了范围。

谢谢!

4

2 回答 2

2

当然...仔细看看并尝试了解这里发生了什么...

out = []
biggest = max(len(item) for item in x)
for i in range(biggest):
    for item in x:
        if len(item) > i:
            out.append(item[i])

而不是out,我会考虑yield在生成器中返回项目。

于 2013-10-20T06:20:42.820 回答
0

使用来自 itertools的roundrobin配方:

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))

演示:

>>> x = ['abc', 'd', 'efgh']
>>> from itertools import cycle, islice
>>> list(roundrobin(*x))
['a', 'd', 'e', 'b', 'f', 'c', 'g', 'h']

另一种选择是使用itertools.izip_longestand itertools.chain.from_iterable

>>> from itertools import izip_longest, chain
>>> x = ['abc', 'd', 'efgh']
>>> sentinel = object()
>>> [y for y in chain.from_iterable(izip_longest(*x, fillvalue=sentinel)) 
                                                           if y is not sentinel]
['a', 'd', 'e', 'b', 'f', 'c', 'g', 'h']
于 2013-10-20T06:17:58.047 回答