【问题标题】:Q: Going from 2 lists of length n -> 1 list of length n, with sublists of length 2?问:从 2 个长度为 n 的列表 -> 1 个长度为 n 的列表,以及长度为 2 的子列表?
【发布时间】:2021-03-13 04:17:01
【问题描述】:

用一个小示例输入和所需输出来描述问题:

a = ['a', 'b', 'c']
b = [1, 2, 3]
c = expr

print(c)
>> [['a', 1], ['b', 2], ['c', 3]]

所以我遇到了一个关于如何以 Python 方式很好地执行此操作的问题。 我想出的是一个列表理解,它使用 zip 很好地完成了这项工作,但是以下列方式使用 zip 确实感觉有点逃避:

[[x, y] for x, y in zip(a,b)]

还有其他方法吗?

此外,由于 zip 不是针对 m 长度为 n 的列表的一般情况的解决方案,因此人们希望以相同的方式组合。 编辑:正如 Dani Mesejo 指出的那样,Pythons zip 内置可以采用 m iterables。

我最感兴趣的是漂亮的普通 python 解决方案。 我知道numpy 可以通过漂亮的 nparray 连接来做到这一点:)

谢谢!

【问题讨论】:

  • 这是最好的方法,你可以将m列表传递给zip,你甚至可以将列表列表作为参数传递给zip
  • 同意@DaniMesejo - 使用zip 函数是处理此问题的Pythonic 方式。它高效、易读且广为人知。
  • @DaniMesejo 啊!我认为 zip 产生“两个”,而不是通用元组。谢谢你,真的很有帮助。

标签: python list numpy list-comprehension numpy-ndarray


【解决方案1】:

用*直接解包zip:

[*zip(a,b)]

将返回一个元组列表,但是如果您严格想要嵌套的 2D 列表,那么您的就是最好的。

【讨论】:

    【解决方案2】:

    您还可以使用 itertools 中的链功能。

    from itertools import chain
    
    chain(zip(a,b))
    

    与上一个答案类似,它将是一个元组列表。但是,如果您的列表有超过 10.000.000 个元素,我强烈建议使用链函数来获得更好的性能。

    python -m timeit -n 10 "from itertools import chain;chain(zip(range(10000000),range(10000000)))"
    10 loops, best of 5: 950 nsec per loop
    
    python -m timeit -n 10 "[*zip(range(10000000),range(10000000))]"
    10 loops, best of 5: 1.14 sec per loop
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多