簡體   English   中英

Python:如何從字典中創建兩個列表

[英]Python: how to make two lists from a dictionary

我有一本字典。

{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

for k, v in dictionary.iteritems():
    x = [k] * len(v)
    y = v
    pyplot.plot(x, y)
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()]

res將是一個元組列表,其中元組中的第一個元素是x值列表,元組中的第二個元素是列表f y值

也許是這樣的:

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

使用此列表理解:

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

作為列表理解:

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

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

我猜一個巫師會把更好的東西放進去,但我會這樣做:

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

對於一個元組,或者

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

列表。

順便說aa當然是字典!

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

python中的map函數允許這樣做

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM