如何在python中返回元组内的对象列表?

时间:2015-02-27 21:40:14

标签: python list tuples

我对python问题感到有点难过。我想写一个函数,它返回一个嵌套在元组中的所有对象的列表。

例如,我希望能够将元组(((2,4),6,(9,(3,7)))转换为[2,4,6,9,3,7]但是,我真的不确定如何开始,因为元组是不可变的。谢谢!

4 个答案:

答案 0 :(得分:1)

你需要扁平化元组元组,请参阅Flattening a shallow list in Python以及James Brady提供的解决方案:

def flatten(x):
    result = []
    for el in x:
        if hasattr(el, "__iter__") and not isinstance(el, basestring):
            result.extend(flatten(el))
        else:
            result.append(el)
    return result

答案 1 :(得分:0)

这是递归的一个很好的例子 - 尽管尼古拉斯已经有了类似的答案。

这里我们设置了你呈现的元组。我们还设置了一个您想要元组的空列表。

该函数以元组开始并循环遍历每个元素。如果元素是一个元组,它会递归地再次调用该函数,直到你得到一个非元组。然后将其插入列表中。

tup = (((2,4),6,(9,(3,7))))
listversion = []
def loopthroughtup(tup):
    for i in tup:
        if type(i) == tuple:
            print str(i) + " is a tuple"
            loopthroughtup(i)
        else:
            print str(i) + " is not a tuple"
            listversion.append(i)

loopthroughtup(tup)
print listversion

答案 2 :(得分:0)

一个非常基本的答案,但应该做你所要求的。使用tryexcept查看该项是否可迭代。如果为True,则递归函数,如果为False,则将该项添加到列表中。

iterable = (((2,4),6,(9,(3,7))))
_list = []


def addToList(elem, listRef):
    """
    elem: item you want to insert into the list
    listRef: list you want to append stuff to
    """
    try:
        for x in elem:
            addToList(x, listRef)    # recursive call
    except:
        listRef.append(elem)    # add the item if it's not iterable


# Main
for item in iterable:
    addToList(item, _list)    # iterate tuple, pass ea. element into addToList, pass the list you want to append to
print _list

Python中的经验法则,快速失败且失败便宜:)

警告:如果元组中有字符串,则每个字符都将附加到_list(因为字符串是可迭代的)。我没有设计字符串,因为你没有指定是否使用它们。

答案 3 :(得分:-2)

from re import findall

a = ((143,243),534,((55,356)),645)
print findall('\d+', str(a))
# ['143', '243', '534', '55', '356', '645']

b = ((1,2),5,((5,6)),345)
print findall('\d+', str(b))
# ['1', '2', '5', '5', '6', '345']