我有一个字符串'{"News":"news", "News":"politics", "News":"breaking", "News":"stories"}'
,我试图将其转换为字典。我已使用json.loads()
和ast.literal_eval()
来转换它们,但似乎两种方法都只使用最后一个键值对。
这个问题是否有单行解决方案?或者我需要更复杂的东西吗?
答案 0 :(得分:4)
假设该字符串是有效的JSON,您可以使用object_pairs_hook
参数到JSON解码器:
import json
def multidict(l):
result = {}
for k, v in l:
result.setdefault(k, []).append(v)
return result
data = '{"News":"news", "News":"politics", ' \
'"News":"breaking", "News":"stories"}'
data = json.loads(data, object_pairs_hook=multidict)
assert data == {'News': ['news', 'politics', 'breaking', 'stories']}
答案 1 :(得分:3)
每个键的字典不能有多个实例。这就是为什么你不能生成一个包含4个相同键的字典,News
就是这种情况。
考虑将数据格式更改为符合您的规范的内容,例如具有列表值的字典:
{"News": ["news", "politics", "breaking", "stories"]}
答案 2 :(得分:3)
您可以将defaultdict
与list
:
>>> from collections import defaultdict
>>> dictionary = defaultdict(list)
>>> values = '{"News":"news", "News":"politics", "News":"breaking", "News":"stories"}'
>>> for pair in values.strip('{}').split(','):
... key, value = pair.strip().split(':')
... key = key.strip('"')
... value = value.strip('"')
... dictionary[key].append(value)
结果:
>>> dictionary
{'News': ['news', 'politics', 'breaking', 'stories']}