2017-04-26 219 views
0

列表地圖的名字我有類型的字典以下列表和列表:蟒蛇,從列表字典

data = [dict(position=1, value=150.3), 
     dict(position=0, value=28.5), 
     dict(position=2, value=1050.3)] 

names = ["CL", "ES", "EUR"] 

我想這樣它們匹配到列表中的值映射到類型的字典列表在字典中的關鍵「位置」的規定值 - 得到以下結果:

data = [dict(name="ES", position=1, value=150.3), 
     dict(name="CL", position=0, value=28.5), 
     dict(name="EUR", position=2, value=1050.3)] 

是否有「智能」和Python的方式來實現這一目標?

+0

似乎關鍵位置從'1'開始,而不是'0'(Python約定)。這是錯誤還是問題規範的一部分? –

+0

@CristiFati是的,我用'position'value映射列表字典的名單 –

+0

@Cong馬OK編輯 –

回答

1

您可以使用列表解析和字典update

data = [dict(position = 2, value=150.3), 
     dict(position = 1, value = 28.5), 
     dict(position=3, value=1050.3)] 

names = ['CL', 'ES', 'EUR'] 

# Sort names according to "position" value of the dictionary 
sorted_names = [names[idx] for idx in map(lambda x: x['position'], data)] 
# Update modifies inplace 
_ = [data[idx].update({'name' : el}) for idx, el in enumerate(sorted_names)] 

這給預期輸出:

所有的
data 
[{'name': 'ES', 'position': 2, 'value': 150.3}, 
{'name': 'CL', 'position': 1, 'value': 28.5}, 
{'name': 'EUR', 'position': 3, 'value': 1050.3}] 
2

首先,請出示在實際的Python形式你的問題。 dict是一種類型;你代表Python字典的方法是用{}

而且,你沒有「的字典和列表」,你有兩個列表,其中一個由三個字典。所以:

data = [ 
    {'position': 1, 'value': 150.3}, 
    {'position': 0, 'value': 28.5}, 
    {'position': 2, 'value': 1050.3} 
] 

names = ["CL", "ES", "EUR"] 

所以,考慮到你有列表,沒有關於排序的問題。一個簡單的循環會給你想要的東西:

for d in data: 
    d['name'] = names[d['position']] 

這將更新data到位:

>>> data 
[{'position': 1, 'name': 'ES', 'value': 150.3}, {'position': 0, 'name': 'CL', 'value': 28.5}, {'position': 2, 'name': 'EUR', 'value': 1050.3}] 
+2

有什麼錯'字典(位置= 1,值= 150.3)',並將其保存鍵入加載報價。 '{...}'是'dict'類型的表達式。'dict(args)'調用類型爲dict的對象的構造函數。最終結果是一樣的。 – nigel222

1

你可以嘗試:

data = [{"position": 2, "value": 150}, 
     {"position": 1, "value": 200}] 
names = ["CL", "ES"] 

for item in data: 
    item["name"] = names[item["pos"] - 1] 

如果我們通過在所有的字典去列表中,則對於每個字典我們設置"name"鍵爲等於值在dataitem["pos"]減去所描述的位置1.

這當然假設您的數據是乾淨的,並且data中的所有項目都正確映射到names中的項目。

如果不是這種情況,使用try-情況除外:

for item in data: 
    try: 
     item["name"] = names[item["pos"] - 1] 
    except IndexError: 
     item["name"] = None 
0

您也可以使用列表中的字典元素update方法,如果你喜歡的關鍵字參數的約定,作爲你的問題的風格表明。

for item in data: 
    item.update(name=names[item["position"]]) 
0

使用列表理解的單線程實現。

print [dict(d.items()+[('name',names[d['position']-1])]) for d in data]