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

More Pythonic way to turn any number of different lists or tuples into one list

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

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,我的代码工作正常,但对于如此简单的事情来说,这似乎是太多的代码。

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

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

>>> 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(),因为默认情况下它们 return 迭代器:

>>> 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>

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

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]

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