我有一个字符串和元组列表。元组看起来像这样(数字,元素):
s = ["element1", (3, "element2"), (2, "element3")]
我需要像这样打印元组:
element1
element2
element2
element2
element3
element3
也就是说,我需要数字*元素打印。我想出的最好的是:
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])
答案 0 :(得分: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))
它是一样的,但在我看来可能有点整洁。
答案 1 :(得分:-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