Python:如何从一本字典中创建两个列表

Python:如何从一本字典中创建两个列表,python,Python,我有一本字典 {1 : [1.2, 2.3, 4.9, 2.0], 2 : [4.1, 5.1, 6.3], 3 : [4.9, 6.8, 9.5, 1.1, 7.1]} 我想将每个key:value对作为两个列表传递给matplotlib.pyplot的一个实例:x值和y值 每个键都是与其值中的每个项关联的x值 因此,我希望每个键有两个列表: [1,1,1,1] [1.2,2.3,4.9,2.0] [2,2,2] [4.1,5.1,6.3] [3,3,3,3,3] [4.9,6.8,

我有一本字典

{1 : [1.2, 2.3, 4.9, 2.0],  2 : [4.1, 5.1, 6.3],  3 : [4.9, 6.8, 9.5, 1.1, 7.1]}
我想将每个key:value对作为两个列表传递给
matplotlib.pyplot
的一个实例:x值和y值

每个键都是与其值中的每个项关联的x值

因此,我希望每个键有两个列表:

[1,1,1,1] [1.2,2.3,4.9,2.0]

[2,2,2] [4.1,5.1,6.3]

[3,3,3,3,3] [4.9,6.8,9.5,1.1,7.1]
有没有一种优雅的方法可以做到这一点

或者有一种方法可以将dict传递给
matplotlib.pyplot

可能类似于:

d = {1 : [1.2, 2.3, 4.9, 2.0], 2 : [4.1, 5.1, 6.3], 3 : [4.9, 6.8, 9.5, 1.1, 7.1]}
result = []
for key, values in d.items():
    result.append(([key]*len(values), values))
map(lambda x: ([x]*len(a[x]),a[x]),a)

res将是一个元组列表,其中元组中的第一个元素是x值列表,元组中的第二个元素是y值列表

x = [1,2,4]
y = [1,24,2]
c = zip(x,y)
print c
d = map(None,x,y)
print d
看看吧。这会给你

[(1, 1), (2, 24), (4, 2)]
对于zip(),如果其中一个列表比其他列表小,则值将被截断:

x = [1,2,4]
a = [1,2,3,4,5]
c = zip(x,a)
print c
d = map(None,x,a)
print d

[(1, 1), (2, 2), (4, 3)]
[(1, 1), (2, 2), (4, 3), (None, 4), (None, 5)]

使用以下列表:

[([k]*len(v), v) for k, v in D.iteritems()]
r = [([k]*len(v), v) for k,v in d.items()]
下面是一个正在使用的示例:

>>> from pprint import pprint
>>> D = {1: [1.2, 2.3, 4.9, 2.0], 2: [4.1, 5.1, 6.3], 3: [4.9, 6.8, 9.5, 1.1, 7.1]}
>>> LL = [([k]*len(v), v) for k, v in D.iteritems()]
>>> pprint(LL)
[([1, 1, 1, 1], [1.2, 2.2999999999999998, 4.9000000000000004, 2.0]),
 ([2, 2, 2], [4.0999999999999996, 5.0999999999999996, 6.2999999999999998]),
 ([3, 3, 3, 3, 3],
  [4.9000000000000004,
   6.7999999999999998,
   9.5,
   1.1000000000000001,
   7.0999999999999996])]

我想一个巫师会做一些更好的事情,但我会这样做:

d = {1 : [1.2, 2.3, 4.9, 2.0], 2 : [4.1, 5.1, 6.3], 3 : [4.9, 6.8, 9.5, 1.1, 7.1]}
result = []
for key, values in d.items():
    result.append(([key]*len(values), values))
map(lambda x: ([x]*len(a[x]),a[x]),a)
对于一个元组,或者

map(lambda x: [[x]*len(a[x]),a[x]],a)
要一份清单

顺便说一句:
a
当然是字典

我假设您使用的是2.x系列。。。

视为列表理解:

[([k]*len(v), v) for k, v in D.iteritems()]
r = [([k]*len(v), v) for k,v in d.items()]
如果您的字典非常大,则需要使用生成器表达式:

from itertools import repeat
r = ((repeat(k, len(v)), v) for k,v in d.iteritems())

…但是请注意,使用
repeat
意味着生成器返回的每个元组中的第一项本身就是生成器。如果字典的值本身没有很多项,那就没有必要了。

我想他要求为每个X/Y值提供两个单独的列表,而不是元组列表。他要求为dict中的每个键提供两个列表。res中的每个元组包含他要求的两个列表。@Edan:figures=sum((pylab.plot(X,Y)表示X,Y表示res),[])+1表示可读性。其他的解决方案都很好,但这一个是可读的——这总是一个优点。简单更好。我喜欢这个解决方案@杰德,谢谢你把这个列表修改成[k]*len(v)。你教了我一些新东西!我喜欢这个信息,我从中了解到,但是John Paulette得到了提示。你错过了括号:
(repeat(k,len(v)),v)
pylab。plot
不接受迭代器,因此
repeat()
在这种情况下不适用。缺少paren已修复。还有对pylab.plot不接受生成器的嘘声,尽管我想可能有原因。