我有一个从列表列表返回列表的函数,其中返回列表按索引号对每个列表的成员进行分组。代码和示例:
def listjoinervar(*lists: list) -> list:
"""returns list of grouped values from each list
keyword arguments:
lists: list of input lists
"""
assert(len(lists) > 0) and (all(len(i) == len(lists[0]) for i in lists))
joinedlist = [None] * len(lists) * len(lists[0])
for i in range(0, len(joinedlist), len(lists)):
for j in range(0, len(lists[0])):
joinedlist[i//len(lists[0]) + j*len(lists[0])] = lists[i//len(lists[0])][j]
return joinedlist
a = ['a', 'b', 'c']
b = [1, 2, 3]
c = [True, False, False]
listjoinervar(a, b, c)
# ['a', 1, True, 'b', 2, False, 'c', 3, False]
有没有办法使用itertools,generators等使它变得更加Pythonic?我看过类似this的示例,但是在我的代码中,各个列表的元素之间没有交互作用。谢谢
答案 0 :(得分:7)
使用itertools.chain.from_iterable
+ zip
:
from itertools import chain
def listjoinervar(*a):
return list(chain.from_iterable(zip(*a)))
用法:
>>> a = ['a', 'b', 'c']
>>> b = [1, 2, 3]
>>> c = [True, False, False]
>>> listjoinervar(a, b, c)
['a', 1, True, 'b', 2, False, 'c', 3, False]
答案 1 :(得分:3)
在正常情况下,我也会使用itertools.chain
,就像奥斯丁的回答一样。
但是,出于完整性考虑,一种不导入任何内容的替代解决方案:
def join_lists(*a):
return [element for sub in zip(*a) for element in sub]
a = ['a', 'b', 'c']
b = [1, 2, 3]
c = [True, False, False]
join_lists(a, b, c)
输出:
['a', 1, True, 'b', 2, False, 'c', 3, False]
答案 2 :(得分:1)
使用zip
和列表理解:
from typing import List, Any
def listjoinervar(*args: List[Any]) -> List[Any]:
return [item for sublist in list(zip(*args)) for item in sublist]
用法:
>>> a = ["a", "b", "c"]
>>> b = [1, 2, 3]
>>> c = [True, False, False]
>>> listjoinervar(a,b,c)
['a', 1, True, 'b', 2, False, 'c', 3, False]
类型注释的使用是可选的。
答案 3 :(得分:0)
您可以使用enumerate
和max
方法来执行此操作,而不必导入任何内容:
def custom_group(*args):
biggest, result = max(args, key = lambda x: len(x)), []
for (i, value) in enumerate(biggest):
for arr in args:
if len(arr) > i:
result.append(arr[i])
return result
您正在遍历最大的列表,并将该索引处每个列表中的每个值(如果存在)添加到结果列表中,然后继续下一个索引,直到循环停止。
使用您指定的数组:
a = ["a", "b", "c"]
b = [1, 2, 3]
c = [True, False, False]
您将这样调用函数:
print(custom_group(a,b,c))
应该导致输出以下列表:
["a", 1, True, "b", 2, False, "c", 3, False]
祝你好运。