从python中的元组中提取元组

时间:2015-03-06 23:34:31

标签: python tuples

鉴于(a, b, (c, d, e, f), g)如何自动提取(c, d, e, f)? (不是逐个显式地提取变量并将它们添加到列表或其他内容)

3 个答案:

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

注意字符串的特殊处理,这对你来说可能不是必需的(因为一个字符串可以一次迭代成一个字符的字符串,但是这个产生的字符串也可以迭代,等等......)