我有以下列表和dicts列表:
data = [dict(position=1, value=150.3),
dict(position=0, value=28.5),
dict(position=2, value=1050.3)]
names = ["CL", "ES", "EUR"]
我想将列表的值映射到dicts列表中,以便它们匹配键中的值#34; position"字典 - 获得以下结果:
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)]
有没有" smart"和pythonic的方法实现那个?
答案 0 :(得分:2)
首先,请以实际的Python形式提出您的问题。 dict
是一种类型;你在Python中表示字典的方式是{}
。
此外,你没有“dict and list”,你有两个列表,其中一个列表由三个词典组成。所以:
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}]
答案 1 :(得分: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 :(得分:1)
你可以尝试:
data = [{"position": 2, "value": 150},
{"position": 1, "value": 200}]
names = ["CL", "ES"]
for item in data:
item["name"] = names[item["pos"] - 1]
我们浏览列表中的所有词典,然后对于每个词典,我们将"name"
键设置为等于data
中item["pos"]
中描述的位置的值减去data
1。
这当然假设您的数据干净,names
中的所有项目都正确映射到for item in data:
try:
item["name"] = names[item["pos"] - 1]
except IndexError:
item["name"] = None
中的项目。
如果不是这种情况,请使用try-except:
WHERE TYPE(rel)="FOLLOW"
AND "User" IN labels(followed)
AND "User" IN labels(follower)
答案 3 :(得分:0)
如果你喜欢关键字 - 参数约定,你也可以在列表中的字典元素上使用update
方法,如问题的样式所示。
for item in data:
item.update(name=names[item["position"]])
答案 4 :(得分:0)
使用列表理解的单线程实现。
print [dict(d.items()+[('name',names[d['position']-1])]) for d in data]