我正在尝试编写一个函数来接受任意数量的不同列表或元组作为参数并返回一个大列表。
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,则将其转换为列表然后添加它。这看起来很臃肿。
答案 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>
如果您不需要所有项目,那么这可能是一件好事。