2017-02-13 10 views
0

У меня есть словарь и набор следующим образом:Python словарь ключей к новому Словарю

fundprices = { 
'A' : 20, 
'B' : 20, 
'C' : 10, 
'D' : 15, 
'E' : 10, 
'F' : 15, 
'G' : 35, 
'H' : 20, 
'I' : 10, 
'J' : 5 
} 

dollaramount = { 
100000.0, 
100000.0, 
50000.0, 
300000.0, 
50000.0, 
100000.0, 
100000.0, 
150000.0, 
50000.0, 
0 
} 

И я пытаюсь создать третий словарь, который является результатом множества разделенного словаря, со следующим код:

orderamount = [] 

for i in fundprices.key(), dollaramount.key(): 
    orderamount.append(dollaramount[i]/fundprices[i]) 

print orderamount 

Где orderamount имеет те же ключи, как цены фонда. Тем не менее, я получаю, что объект «dict» не имеет атрибутов. В этом случае dollaramount представляет собой набор, созданный из другого расчета из 2 словарей. Если проще добавить ключи, когда установлен установленный доллар, дайте мне знать. Как это исправить?

+6

Второй объект не является словарем. это набор. –

+4

На самом деле, это даже не набор - там есть избыточная закрывающая скобка. Также, если вы разделите первое на второе, вы получите ошибку с делением на нуль. – SiHa

+2

Как 'dollaramount' относится к' fundprices'? Напомним, словари неупорядочены. –

ответ

0
from collections import OrderedDict 
fundprices = { 
    'A' : 20, 
    'B' : 20, 
    'C' : 10, 
    'D' : 15, 
    'E' : 10, 
    'F' : 15, 
    'G' : 35, 
    'H' : 20, 
    'I' : 10, 
    'J' : 5 
    } 

dollaramount = [ 
    100000.0, 
    100000.0, 
    50000.0, 
    300000.0, 
    50000.0, 
    100000.0, 
    100000.0, 
    150000.0, 
    50000.0, 
    0] 
ordered_fundprices = OrderedDict(sorted(fundprices.items())) 
for i, j in zip(ordered_fundprices.keys(), dollaramount): 
    print i, j 

for i, j in zip(ordered_fundprices.itervalues(), dollaramount): 
    print j/i 

Вы хотели получить такой результат?

A 100000.0 
B 100000.0 
C 50000.0 
D 300000.0 
E 50000.0 
F 100000.0 
G 100000.0 
H 150000.0 
I 50000.0 
J 0 
5000.0 
5000.0 
5000.0 
20000.0 
5000.0 
6666.66666667 
2857.14285714 
7500.0 
5000.0 
0 
+0

Вы не можете полагаться на это поведение - словари неупорядочены, и это даст случайные результаты для разных прогонов/разных версий python и т. Д. В стороне, вам не нужно использовать метод 'keys' для перебора ключей' dict' - это происходит автоматически и неэффективно в Python 2 и ненужно и избыточно в Python 3. –

+0

Нет, результат всегда будет таким же. Потому что порядок ключей указывается один раз и так же до конца жизни этого объекта. И я соглашусь, это не упорядочено. Обратите внимание на тот же порядок при запуске этого цикла в качестве третьего: 'для i, j в zip (fundprices.itervalues ​​(), dollaramount): print j/i a.append (j/i)' 'for i , j в zip (fundprices.keys(), a): print i, j' –

+0

Но у вас нет способа узнать, какие коэффициенты вы получите * пока не запустите код *, и маловероятно, что OP хочет случайные отношения , Так что да, если вы не изменяете словарь, вы получите тот же результат, но вы не можете знать, каким будет этот результат, * потому что словари неупорядочены *. –

0

Использование list вместо set, как dollaramount фактически euqals к,

set([0, 50000.0, 100000.0, 150000.0, 300000.0]) 

Тогда мы имеем,

orderamount = [amount/t[1] for amount, t in zip(dollaramount, sorted(fundprices.items()))] 

print(orderamount) 
# [5000.0, 5000.0, 5000.0, 20000.0, 5000.0, 6666.666666666667, 2857.1428571428573, 7500.0, 5000.0, 0] 

Если вы хотите иметь словарь, который запоминает порядок, что ключи были сначала вставлен, используйте collections.OrderedDict.

+0

Честно говоря, нет смысла ставить результат '' sorted (fundprices.items()) 'в' OrderedDict', а затем перебирать 'items' ... просто использовать' sortd (fundprices.items()) 'непосредственно ... –

+0

@ juanpa.arrivillaga, thx. Я сделал это для удобства чтения. Во всяком случае, я только что обновил свой ответ. – SparkAndShine

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

  • Нет связанных вопросов^_^