[英]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)
列表。
順便說a
: a
當然是字典!
我假設你使用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.