【问题标题】:Python: create two lists from dict with list of tuplesPython:使用元组列表从dict创建两个列表
【发布时间】:2017-02-28 15:42:38
【问题描述】:

鉴于这个字典:

d={0: [(78.65, 89.86),
  (28.0, 23.0),
  (63.43, 9.29),
  (66.47, 55.47),
  (68.0, 4.5),
  (69.5, 59.0),
  (86.26, 1.65),
  (84.2, 56.2),
  (88.0, 18.53),
  (111.0, 40.0)], ...}

如何创建两个列表,以便y 获取每个元组的第一个元素,x 获取第二个,对于 d 中的每个键

在上面的示例中(仅显示key=0),这将是:

y=[78.65, 28.0, 63.43, 66.47, 68.0, 69.5, 86.26, 84.2, 88.0, 111.0]
x=[89.86, 23.0, 9.29, 55.47, 4.5, 59.0, 1.65, 56.2, 18.53, 40.0]

我的尝试是错误的(我只尝试了x 列表):

for j,v in enumerate(d.values()):    
   x=[v[i[1]] for v in d.values() for i in v]

因为:

TypeError                                 Traceback (most recent call last)
<ipython-input-97-bdac6878fe6c> in <module>()
----> 1 x=[v[i[1]] for v in d.values() for i in v]

TypeError: list indices must be integers, not numpy.float64

这是怎么回事?

【问题讨论】:

  • 我不清楚如果字典包含两个元素会发生什么...
  • 您的意思是另一个带有key=1 的元组列表?在那种情况下,不多,因为我想在 for 循环中提取这两个列表,以便在每次迭代时它们都是不同的。这能回答你的问题吗?
  • x=[i[1] for v in d.values() for i in v] 应该适用于您的 sn-p

标签: python list dictionary tuples


【解决方案1】:

如果我正确理解了您的评论,您希望获取与键 0 关联的元组列表的 xy 坐标。在这种情况下,您可以简单地使用zip(..)map(..)lists:

y,x = map(list,zip(*d[0]))

如果您不想在以后的程序中更改xy - 不可变列表基本上是tuples,您可以省略map(list,...)

y,x = zip(*d[0]) # here x and y are tuples (and thus immutable)

请注意,如果字典包含两个元素,例如:

{0:[(1,4),(2,5)],
 1:[(1,3),(0,2)]}

它将仅处理0 键的数据。所以y = [1,2]x = [4,5]

【讨论】:

  • 是的,我是。这些坐标以(row, column) 的形式返回。
  • 或者,在 python 3 中,它产生迭代器,python 将其解包成元组。
  • 我喜欢这个解决方案,但是如果 y,x = zip(*d[0]) 嵌套在 for 循环中以遍历所有键怎么办?把它改成y,x = zip(*d[i])就够了吗?
  • @CF84:是的。如果您使用for i in d:,它将获取每个键并获取该键的xy
【解决方案2】:

你的意思是这样的吗?

z = [i for v in d.values() for i in v]
x, y = zip(*z)

【讨论】:

  • 为什么要构造一个新的元组而不返回i本身?
猜你喜欢
  • 2022-12-08
  • 1970-01-01
  • 2015-04-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多