Python:使用带有元组列表的dict创建两个列表

时间:2017-02-28 15:42:38

标签: python list dictionary tuples

鉴于这个词:

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

这有什么问题?

2 个答案:

答案 0 :(得分:4)

如果我正确理解了您的评论,您希望获取与密钥x关联的元组列表的y0坐标。在这种情况下,您只需使用zip(..)map(..)list s:

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

如果您不想在程序中稍后更改xy - 不可变列表基本上是tuple s,则可以省略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]

答案 1 :(得分:2)

你的意思是这样吗?

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