2009-11-15 3 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, связанное с каждым элементом в его значении.

Так что я хочу два списка для каждого ключа:

[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?

ответ

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

+1 для удобства чтения. Другие решения хороши, но этот читаем - это всегда плюс. –

+0

Простой лучше. Любите это решение! – jathanism

+0

@Jed, спасибо за то, что вы изменили это компиляцию списка в [k] * len (v). Вы научили меня чему-то новому! –

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

Реза будет список кортежей, где первый элемент кортежа является вашим списком х значений и второго элемента в кортеже список вашего е у-значение

+0

Я думаю, он попросил два отдельных списка для каждого значения X/Y, а не список кортежей. –

+1

Он попросил два списка для каждого ключа в dict. Каждый кортеж в res содержит два списка, которые он просил. – sdtom

+0

@Edan: figure = sum ((pylab.plot (x, y) для x, y в res), []) – jfs

-1

функция карты в питоне допустит

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) 

для списка.

кстати: 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

Мне нравится эта информация, я узнал от нее, но Джон Полетт получает галочку. –

+0

Вы пропустили скобки: '(repeat (k, len (v)), v)'. – jfs

+0

'pylab.plot' не принимает итераторы, поэтому' repeat() 'в этом случае неприменим. – jfs

Смежные вопросы