将 dict 列表转换为 dict python - pythonic 方式
convert list of dict into dict python - pythonic way
输入:
list = [{'key': '1234', 'value': 100.00}, {'key': '2345', 'value': 200.0}]
输出:
{'1234': 100.00, '2345': 200.0}
我现在可以通过循环来实现。有什么 pythonic 方法可以做到这一点吗?
通过“pythonic”,我认为这意味着使用诸如字典理解之类的东西:
list = [{'key': '1234', 'value': 100.00}, {'key': '2345', 'value': 200.0}]
output = {item["key"]: item["value"] for item in list}
print(output) # {'1234': 100.00, '2345': 200.0}
顺便说一句,您可能想将 list
重命名为其他名称,因为 list
是一个内部 python 函数。
你说得对,循环很简单。
result = {}
for curr in lst:
result[curr['key']] = result[curr['value']]
我们可以通过字典理解将其缩短一点。这说的是同样的事情,但更简洁
result = { curr['key']: curr['value'] for curr in lst }
嵌套推导可以这样写成一行:
data = [{'key': '1234', 'value': 100.00}, {'key': '2345', 'value': 200.0}]
new_dict = {r[0]: r[1] for r in [list(d.values()) for d in data]}
感谢 ShadowRanger 可以简化为:
new_dict = dict(d.values() for d in data)
它仅适用于 Python 3.7+ 和有序的字典。
只是为了好玩,一种不涉及对每个项目执行 Python 级代码的方法:
from operator import itemgetter
lst = [{'key': '1234', 'value': 100.00}, {'key': '2345', 'value': 200.0}]
dct = dict(map(itemgetter('key', 'value'), lst))
The itemgetter
,当从 lst
传递 dict
时,提取键和值并将它们 returns 作为 tuple
。 map
确保为 lst
中的每个 dict
完成此操作,并且 dict
构造函数知道如何将两个 tuple
的可迭代转换为新的 dict
,所有这些都没有为任何给定的项目执行单个字节码(所有涉及的字节码都是固定的开销来设置一切,然后 map
迭代器是 运行 耗尽来填充 dict
无需将控制权返回到字节码 eval 循环,只要涉及的所有键和值都是 C 中内置的实现即可。
只需使用每个字典的值来创建新字典:
dict(map(dict.values, lst))
{'1234': 100.0, '2345': 200.0}
注意,dict 需要像您的示例中那样按 key/value 顺序排列才能正常工作。这也意味着这将在 Python 3 中正常工作,但您需要在 python 2.7
中使用 collections.OrderedDict
输入:
list = [{'key': '1234', 'value': 100.00}, {'key': '2345', 'value': 200.0}]
输出:
{'1234': 100.00, '2345': 200.0}
我现在可以通过循环来实现。有什么 pythonic 方法可以做到这一点吗?
通过“pythonic”,我认为这意味着使用诸如字典理解之类的东西:
list = [{'key': '1234', 'value': 100.00}, {'key': '2345', 'value': 200.0}]
output = {item["key"]: item["value"] for item in list}
print(output) # {'1234': 100.00, '2345': 200.0}
顺便说一句,您可能想将 list
重命名为其他名称,因为 list
是一个内部 python 函数。
你说得对,循环很简单。
result = {}
for curr in lst:
result[curr['key']] = result[curr['value']]
我们可以通过字典理解将其缩短一点。这说的是同样的事情,但更简洁
result = { curr['key']: curr['value'] for curr in lst }
嵌套推导可以这样写成一行:
data = [{'key': '1234', 'value': 100.00}, {'key': '2345', 'value': 200.0}]
new_dict = {r[0]: r[1] for r in [list(d.values()) for d in data]}
感谢 ShadowRanger 可以简化为:
new_dict = dict(d.values() for d in data)
它仅适用于 Python 3.7+ 和有序的字典。
只是为了好玩,一种不涉及对每个项目执行 Python 级代码的方法:
from operator import itemgetter
lst = [{'key': '1234', 'value': 100.00}, {'key': '2345', 'value': 200.0}]
dct = dict(map(itemgetter('key', 'value'), lst))
The itemgetter
,当从 lst
传递 dict
时,提取键和值并将它们 returns 作为 tuple
。 map
确保为 lst
中的每个 dict
完成此操作,并且 dict
构造函数知道如何将两个 tuple
的可迭代转换为新的 dict
,所有这些都没有为任何给定的项目执行单个字节码(所有涉及的字节码都是固定的开销来设置一切,然后 map
迭代器是 运行 耗尽来填充 dict
无需将控制权返回到字节码 eval 循环,只要涉及的所有键和值都是 C 中内置的实现即可。
只需使用每个字典的值来创建新字典:
dict(map(dict.values, lst))
{'1234': 100.0, '2345': 200.0}
注意,dict 需要像您的示例中那样按 key/value 顺序排列才能正常工作。这也意味着这将在 Python 3 中正常工作,但您需要在 python 2.7
中使用collections.OrderedDict