- 以 Pythonic 方式,python 如何将多个列表分组到单个列表中?

我从列表列表中返回一个函数返回列表,其中返回列表按索引号对每个列表的成员进行分组。 代码和示例:


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,生成器等使这更像Pythonic? 我已经看过这样的例子但是在我的代码中没有与各个列表的元素进行交互。 谢谢

时间:

在正常情况下,我也会使用 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]



使用 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]



使用 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]



类型注释的使用是可选的。

你可以使用 enumeratemax 方法,无需导入任何内容即可完成这里操作:


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]



好运。

...