2009-11-15 45 views
4

我有一本字典。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]} 

欲每個鍵通過:值對的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] 

有一種優雅的方式來做到這一點?

或者有一種方法可以將字典傳遞給matplotlib.pyplot

回答

13
for k, v in dictionary.iteritems(): 
    x = [k] * len(v) 
    y = v 
    pyplot.plot(x, y) 
+1

+1表示可讀性。其他解決方案很好,但是這個解決方案是可讀的 - 這總是一個優點。 – 2009-11-15 19:15:22

+0

簡單就好。愛這個解決方案! – jathanism 2009-11-15 19:26:32

+0

@Jed,感謝您將列表comphresion更改爲[k] * len(v)。你教了我一些新的東西! – 2009-11-15 19:52:45

2

也許是這樣的:

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)) 
3
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]} 

res = [([x]*len(y), y) for x, y in d.iteritems()] 

資源將是元組,其中元組中的第一個元素是你的x值和元組中的第二個元素的列表的列表您的清單f y值

+0

我認爲他要求爲每個X/Y值要求兩個單獨的列表,而不是元組列表。 – 2009-11-15 18:51:57

+1

他要求爲字典中的每個關鍵字列出兩個列表。 res中的每個元組都包含他要求的兩個列表。 – sdtom 2009-11-15 19:11:05

+0

@Edan:figures = sum((pylab.plot(x,y)for x,y in res),[]) – jfs 2009-11-15 22:39:38

-1

在Python地圖功能將允許該

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)] 

在拉鍊()的情況下,如果列表中的一個較小那麼別人,數值將被截斷:

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)] 
2

使用該列表理解:

[([k]*len(v), v) for k, v in D.iteritems()] 

下面是使用它的一個例子:

>>> 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])] 
0

我想,一個嚮導將會把一些東西更好,但我會做這樣的事情:

map(lambda x: ([x]*len(a[x]),a[x]),a) 

一個元組,或

map(lambda x: [[x]*len(a[x]),a[x]],a) 

的列表。

btw:a是字典,當然!

我假設你使用2.x系列...... 問候

1
>>> 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 = [ ([k] * len(d[k]), d[k]) for k in d.keys() ] 
>>> print result 
[([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])] 
2

作爲一個列表理解:

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表示發生器返回的每個元組中的第一項本身就是一個生成器。如果字典的值本身不包含很多項目,那就沒有必要了。

+0

我喜歡這個信息,我從中學到了東西,但John Paulette得到了答案。 – 2009-11-15 19:43:14

+0

你錯過了括號:'(repeat(k,len(v)),v)'。 – jfs 2009-11-15 22:23:26

+0

'pylab.plot'不接受迭代器,因此'repeat()'不適用於這種情況。 – jfs 2009-11-15 22:33:03