更多Pythonic方式将任意数量的不同列表或元组转换为一个列表

时间:2015-05-29 19:06:14

标签: python list args

我正在尝试编写一个函数来接受任意数量的不同列表或元组作为参数并返回一个大列表。

def addify(*args):
    big_list = list()
    for iterable in args:
        if isinstance(iterable, tuple):
            big_list.extend(list(iterable))
        else:
            big_list.extend(iterable)
    return big_list

>>> print addify((1,2,3), [2, 5, 3], (3,1,3), [3, 2344, 3])
[1, 2, 3, 2, 5, 3, 3, 1, 3, 3, 2344, 3]

我正在学习args and kwargs,而且我的代码工作正常,但对于这么简单的事情,这似乎太多了。

必须有一个更好的方法,比编写一个long函数来检查参数是否为元组,如果是add,则将其转换为列表然后添加它。这看起来很臃肿。

2 个答案:

答案 0 :(得分:4)

itertools.chain正是您所寻找的:

>>> from itertools import chain
>>> print list(chain((1,2,3), [2, 5, 3], (3,1,3), [3, 2344, 3]))
[1, 2, 3, 2, 5, 3, 3, 1, 3, 3, 2344, 3]

注意:如果您想要列表而不是list对象,则需要调用itertools.chain

答案 1 :(得分:3)

此功能已通过itertools.chain包含在Python中:

>>> from itertools import chain
>>> def addify(*args):
...     return list(chain(*args))
... 
>>> addify((1,2,3), [2, 5, 3], (3,1,3), [3, 2344, 3])
[1, 2, 3, 2, 5, 3, 3, 1, 3, 3, 2344, 3]

那,或者@Navith说,你可以使用itertools.chain.from_iterable

>>> from itertools import chain
>>> def addify(*args):
...     return list(chain.from_iterable(args))
... 
>>> addify((1,2,3), [2, 5, 3], (3,1,3), [3, 2344, 3])
[1, 2, 3, 2, 5, 3, 3, 1, 3, 3, 2344, 3]

但是请注意,您需要在两者上调用list(),因为它们默认返回迭代器:

>>> chain((1,2,3), [2, 5, 3], (3,1,3), [3, 2344, 3])
<itertools.chain object at 0x04829390>
>>> chain.from_iterable([(1,2,3), [2, 5, 3], (3,1,3), [3, 2344, 3]])
<itertools.chain object at 0x048293D0>

如果您不需要所有项目,那么这可能是一件好事。