最优雅的编程(pythonic)方法是获取列表列表的第i个元素,并创建这些第i个元素的列表

最优雅的编程(pythonic)方法是获取列表列表的第i个元素,并创建这些第i个元素的列表,python,list,Python,List,比如说你有一个列表,一个列表 lll = [(['a', 'b'], [1, 2], [True, False]), (['c'], [3], [True]), (['d', 'e', 'f', 'g'], [4, 5, 6, 7], [True, False, True, False])] 对于lll中的每个项目,我希望每个项目列表中的第I个元素的列表,并且我希望所有这些列表都在一个列表中 正如你所能想象的,用文字来描述这是非常棘手的,但我希望最终的结果是这样的

比如说你有一个列表,一个列表

lll = [(['a', 'b'], [1, 2], [True, False]),
       (['c'], [3], [True]),
       (['d', 'e', 'f', 'g'], [4, 5, 6, 7], [True, False, True, False])]
对于lll中的每个项目,我希望每个项目列表中的第I个元素的列表,并且我希望所有这些列表都在一个列表中

正如你所能想象的,用文字来描述这是非常棘手的,但我希望最终的结果是这样的

result = [
['a', 1, True],
['b', 2, False].
['c', 3, True],
['d', 4, True],
['e', 5, False],
['f', 6, True],
['g', 7, False]
]
到目前为止我所尝试的是

newList = []
for item in lll:
    num_things = len(item[0])
    for ii in range(num_things):
        newList.append([x[ii] for x in item])

newList

有没有一种更符合pythonical优雅的方法来获得这个结果?

使用
zip
+
chain.from\u iterable

from itertools import chain

o = chain.from_iterable(zip(*ll) for ll in lll)
print(list(o))

# output
# [('a', 1, True), ('b', 2, False), ('c', 3, True), ('d', 4, True), ('e', 5, False), ('f', 6, True), ('g', 7, False)]
然后,您可以使用列表来将每个元素映射到列表,而不是元组列表

l = [list(i) for i in o]
print(l)

# output
# [['a', 1, True], ['b', 2, False], ['c', 3, True], ['d', 4, True], ['e', 5, False], ['f', 6, True], ['g', 7, False]]


我相信你想要这个:

list(map(list,zip(*[sum(l,[]) for l in zip(*lll)])))

您的原始代码一点也不差。这些很好,但我认为

result = []

for item in lll:
    result.extend(zip(*item))
是相当简洁和通俗的,可以说比一行更可读,没有导入,值得考虑
extend
append
+循环的常见重构,用于展平列表,
zip
几乎总是进行列式迭代和矩阵旋转的方法

如果需要列表而不是元组:

result = []

for item in lll:
    result.extend([list(x) for x in zip(*item)])
或使用
地图

for item in lll:
    result.extend(map(list, zip(*item)))

以下是一些小的风格建议:

  • snake\u case
    优于
    camelCase
  • 避免将
    l
    作为变量名。对于
    i
    1
    来说,它太容易混淆了

另外,
num\u things=len(项[0])
让我觉得有点危险,因为如果
item
为空,它将引发一个
索引器

[[*ys] for xss in lll for ys in zip(*xss)]

zip星形转置,第二个
用于连接,内方括号将元组从zip转换为列表。

你想要矩阵转置吗?我在想,但它是否适用于不同长度的列表?如果先将它们串联起来,可能会出现这种情况。这是对仅用于数字类型的
sum
的滥用。它目前在CPython中的列表上工作,这是一个实现细节,不能保证在其他Python实现或未来版本中保持不变。请参阅
help(sum)
。什么,我从来没有听说过?sum()函数旨在具有可操纵的初始值。这就是允许在任何带有uu add uuu()的类上使用sum()的原因。
sum
的docstring说明“此函数专门用于数值,可能会拒绝非数值类型。”举个例子会有帮助吗?什么?不变性与此无关。默认的
0
是不可变的,您知道。@ggorlen区别在于您的版本构建了一个元组列表,而我的版本构建了请求的列表列表。不同类型。啊,打得好。谢谢你的澄清。你甚至在解释中写道:-)