2

我有一个字符串和元组的列表。元组看起来像这样(数字,元素):

s = ["element1", (3, "element2"), (2, "element3")]

我需要像这样打印元组:

element1
element2
element2
element2
element3
element3

也就是说,我需要 number*element 打印。我想出的最好的是:

s = ["element1", (3, "element2"), (2, "element3")]

def bb (x):
    for n in x:
        if isinstance (n, str):
           print (n)
        if isinstance (n, tuple):
            print (n[1])
4

2 回答 2

2

理想情况下,更改您的输入以便获得[(1, "element1,"), ...],但如果这不可能:

import types
import itertools

s = ["element1", (3, "element2"), (2, "element3")]

print(list(itertools.chain.from_iterable((e, ) if isinstance(e, str) else itertools.repeat(e[1], e[0]) for e in s)))

给我们:

['element1', 'element2', 'element2', 'element2', 'element3', 'element3']

我们在这里所做的是将您的元素转换为元组,如果是字符串(这样它们就不会被迭代成字符),并itertools.repeat()用于创建一个迭代器,如果它们是元组,则重复给定的次数。然后,我们使用itertools.chain.from_iterable()将这个集合集合扁平化为一个迭代器,然后将其转换为一个列表。

请注意,在 2.x 中,您需要isinstance(e, basestring).

编辑:或者:

args = ((e, 1) if isinstance(e, str) else (e[1], e[0]) for e in s)
itertools.chain.from_iterable(itertools.starmap(itertools.repeat, args))

这是同样的事情,但在我看来可能更整洁一些。

于 2012-12-02T21:21:13.050 回答
-1

这是一个单行:

s = ["element1", (3, "element2"), (2, "element3")]
result = sum(([x] if type(x) != tuple else x[0]*[x[1]] for x in s), [])

或扩展您现有的代码:

def bb(x):
    for n in x:
        if isinstance(n, str):
            print(n)
        elif isinstance(n, tuple):
            count, value = n
            for i in range(count):
                print(value)

如果要返回这些值,可能需要使用生成器:

def bb_gen(x):
    for n in x:
        if isinstance(n, str):
            yield n
        elif isinstance(n, tuple):
            count, value = n
            for i in range(count):
                yield value

for value in bb_gen(s):
    print value
于 2012-12-02T21:17:14.657 回答