如何以Python方式将多个列表分组到单个列表中?

如何以Python方式将多个列表分组到单个列表中?,python,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

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

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的功能?我看过这样的例子,但在我的代码中,没有与单个列表的元素进行交互。谢谢使用+:

用法

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

您可以使用
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]

祝你好运。

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

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

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

请注意,这些是
列表
,而不是
数组
。谢谢,请您解释一下为什么在“正常情况”下,您会使用itertools.chain,而似乎不用它就可以做到这一点?itertools.chain还有其他好处吗?@Shanloh不,它们实际上是一样的。然而,我个人认为
chain.from_iterable(zip(*[a,b,c])
比理解方法更具可读性。谢谢,我接受这个答案,因为在这些情况下,列表理解可以不附加任何内容dependencies@shanlodh,您可能还对:@Austin:谢谢,有趣的链接,特别是zwer在链接OP下的评论,反映了我在这个案例中的经历。我的OP func似乎比实际代码中的Pythonic解决方案运行得更快如果列表长度不同呢?那么您的需求是什么呢?断言可以防止出现这种情况,并且它们不应该符合程序的逻辑
>>> 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]