【问题标题】:How to merge 1D & 2D tuples in Python?如何在 Python 中合并一维和二维元组?
【发布时间】:2019-02-25 18:49:47
【问题描述】:

如何在 Python 中合并一维和二维元组?

所以给定两个列表

heights = (   165,     152,     145,    174)
pos_2D  = ( (2,3), (32,52), (73,11), (43,97) )

我想要这样的东西

pos_3D = merge(heights, pos_2D)

在哪里

pos_3D = ( (2,3,165), (32,52,152), (73,11,145), (43,97,174) )

pythonic 的方法是什么?

【问题讨论】:

  • 只需为两者创建新元组。或使用zip

标签: python list merge tuples


【解决方案1】:

使用zip

例如:

heights = (   165,     152,     145,    174)
pos_2D  = ( (2,3), (32,52), (73,11), (43,97) )

print(tuple(j + (i,) for i, j in zip(heights, pos_2D)) )

输出:

((2, 3, 165), (32, 52, 152), (73, 11, 145), (43, 97, 174))

【讨论】:

  • 列表转换似乎没有必要tuple(j + (i,) for i, j in zip(heights, pos_2D))
  • @Chris_Rands。谢谢
【解决方案2】:

zip

zip(heights,*zip(*pos_2D))

>>>[(165, 2, 3), (152, 32, 52), (145, 73, 11), (174, 43, 97)]

或者如果你想要tuple

tuple(zip(heights,*zip(*pos_2D)))
>>>((165, 2, 3), (152, 32, 52), (145, 73, 11), (174, 43, 97))

zip 从两个参数中生成元组列表,zip(*_) 将元组转换回单个参数(将其视为解压缩)。


代码说明。

heights = (   165,     152,     145,    174)
pos_2D  = ( (2,3), (32,52), (73,11), (43,97) )

使用第二个元组pos_2D,我们可以将其解压缩为单独的参数

pos_2D_unzipped = zip(*pos_2D)
print pos_2D_unzipped
>> [(2, 32, 73, 43), (3, 52, 11, 97)]

现在我们可以使用它来压缩heightspos_2D_unzipped 以获得您想要的东西。

为此,我们可以执行zip(heights, pos_2D_unzipped) 之类的操作,但仅使用pos_2D_unzipped 的两个长元组压缩zip 的前2 个元素。

zip(heights, pos_2D_unzipped)
[(165, (2, 32, 73, 43)), (152, (3, 52, 11, 97))]

你真正需要做的是:为zip提供三个参数,1.heights,2.pos_2D_unzipped的第一个元素和3.pos_2D_unzipped的第二个元素

所以你可以做类似的事情:

zip(heights, pos_2D_unzipped[0],pos_2D_unzipped[1])
>>[(165, 2, 3), (152, 32, 52), (145, 73, 11), (174, 43, 97)]

哪个有效!但是你可以做一些更快的事情。 pos_2D_unzipped 是两个元素的列表(它们是长元组),如果您可以将列表的每个元素直接提供给 zip,那就太好了。这正是*pos_2D_unzippedzip(__) 中所做的事情。它将列表打开为函数的各个参数。

因此,现在你可以做到了,

zip(heights, *pos_2D_unzipped)
>>[(165, 2, 3), (152, 32, 52), (145, 73, 11), (174, 43, 97)]

更好的是,现在您可以将解压缩pos_2D 和压缩heightspos_2D_unzipped 这两个步骤压缩为一个步骤。

zip(heights,*zip(*pos_2D))

【讨论】:

  • 您能解释一下您的第一个示例是如何工作的吗?看起来有点神奇(从初学者的角度来看)。在此先感谢:)
  • 这很有帮助。这更有意义。
  • 这很有帮助。它更有意义。因此,首先您将二维列表分解为两个元组,其中包含第一个数字 x 和 y。然后 *pos_2D_unzipped 允许我们将 x 和 y 分别传递给下一个 zip 函数。
【解决方案3】:

它们不完全是 1D 或 2D。第一个只是一个整数元组,第二个是一个元组。因此,您只需并行迭代它们(使用 zip)并为每对元素创建一个新的元组元素

result = tuple( (*pos, h) for pos, h in zip(pos2D, heights))

【讨论】:

  • 这正是我要找的东西 :) 简单而全在一条线上!酷 :) 谢谢 blue_note :)
猜你喜欢
  • 2021-11-17
  • 1970-01-01
  • 2017-04-12
  • 2018-10-04
  • 2020-02-04
  • 2021-10-21
  • 1970-01-01
  • 2018-09-20
  • 1970-01-01
相关资源
最近更新 更多