鉴于(a, b, (c, d, e, f), g)
如何自动提取(c, d, e, f)
? (不是逐个显式地提取变量并将它们添加到列表或其他内容)
答案 0 :(得分:1)
如果要从列表中提取第一个元组,只需执行:
tup = ('a', 'b', ('c', 'd', 'e', 'f'), 'g')
# Get first tuple
print (_ for _ in tup if type(_) is tuple).next()
# ('c', 'd', 'e', 'f')
答案 1 :(得分:1)
如果要提取元组中的所有元组值项,可以在单行中使用filter() function:
filter(lambda a: isinstance(a, tuple), yourEnclosingTuple)
如果你想要你所展示的特定的那个,如果你想要一个特定的那个就这么简单:
>>> x = (1, 2, (3,4,5,6), 7)
>>> x[2]
(3, 4, 5, 6)
>>>
答案 2 :(得分:1)
也许这个小食谱会有所帮助。然而,它使用Python 3.4语法,并使用生成器和生成器委派。
def flatten(iterator):
for item in iterator:
if hasattr(item, "__iter__") and not isinstance(item, str):
yield from flatten(item)
else:
yield item
print(list(flatten((1, "2", (3, 4, (5, 6), 7), 8.0, (9, 10), 11))))
# [1, '2', 3, 4, 5, 6, 7, 8.0, 9, 10, 11]
简单地说:该函数创建一个生成器,如果它们是单个元素,将生成每个元素。如果一个元素是可迭代的(具有__iter__
属性),则它使用递归来生成可迭代元素内的元素。
对于Python 2兼容的生成器,您可以使用:
def flatten(iterator):
for item in iterator:
try:
it = iter(item)
except TypeError:
yield item
else:
if not isinstance(item, basestring):
for inner_item in flatten(item):
yield inner_item
else:
yield item
print list(flatten((1, "2", (3, 4, (5, 6), 7), 8.0, (9, 10), 11)))
# [1, '2', 3, 4, 5, 6, 7, 8.0, 9, 10, 11]
注意字符串的特殊处理,这对你来说可能不是必需的(因为一个字符串可以一次迭代成一个字符的字符串,但是这个产生的字符串也可以迭代,等等......) 的