【问题标题】:python - is there a way to use list comprehension to create a list based on the extracted common indexes of sublists?python - 有没有办法使用列表推导根据提取的子列表的公共索引创建列表?
【发布时间】:2023-04-02 13:36:01
【问题描述】:

我正在尝试找出一种干净的方法来获取每个子列表的相同索引处的元素并根据这些提取的元素创建一个新列表,所以首先我想要一个包含每个早期子列表的元素 0 的子列表,然后元素 1、2 等相同。目前我正在使用以下代码来获得我想要的结果:

lst = [[1, 2, 3, 4], ['a', 'b', 'c', 'd'], [True, True, False, True], [14.5, 15.6, 12.5, 12.3]]
approach_1 = []

for i, item in enumerate(lst[0]):
    approach_1.append([item, lst[1][i], lst[2][i], lst[3][i]])

这给了我

approach_1 = [[1, 'a', True, 14.5], [2, 'b', True, 15.6], [3, 'c', False, 12.5], [4, 'd', True, 12.3]]

结果是我正在寻找的,但有没有办法让我在一条线上实现这一目标?我可以将以下内容用于一个元素:

approach_2 = [x[0] for x in lst] 

有没有类似的东西会返回与方法_1相同的结果?

【问题讨论】:

标签: python list indexing list-comprehension sublist


【解决方案1】:
list( zip( lst[0], lst[1], lst[2], lst[3] ) )

或者如果你希望每个元素都是一个列表而不是一个元组,你可以这样做

result = [ list(x) for x in list( zip( lst[0], lst[1], lst[2], lst[3] ) ) ]

【讨论】:

  • 这需要事先知道lst的长度。用于解包的 Python 语法 * 是一个很好的技巧,例如查看其他解决方案
【解决方案2】:

具有列表理解的解决方案:

[list(i) for i in zip(*lst)]

# [[1, 'a', True, 14.5], [2, 'b', True, 15.6], [3, 'c', False, 12.5], [4, 'd', True, 12.3]]

或者,使用地图

list(map(list, zip(*lst)))

会给你同样的结果

【讨论】:

    【解决方案3】:

    你可以在一行中写两个 for 循环!

    new_list = [[j[i] for j in lst] for i in range(0, len(lst[0]))]
    

    【讨论】:

      【解决方案4】:

      内置的zip 函数完全符合您的要求:

      >>> lst = [[1, 2, 3, 4], ['a', 'b', 'c', 'd'], [True, True, False, True], [14.5, 15.6, 12.5, 12.3]]
      >>> list(zip(*lst))
      [(1, 'a', True, 14.5), (2, 'b', True, 15.6), (3, 'c', False, 12.5), (4, 'd', True, 12.3)]
      

      【讨论】:

      • 哇,这太完美了!谢谢,我知道答案会非常简单 xD
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-01-21
      • 2019-11-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-29
      相关资源
      最近更新 更多