【问题标题】:String To Dictionary with Multiple Values for a Key一个键的多个值的字符串到字典
【发布时间】:2017-03-14 00:22:23
【问题描述】:

我有一个字符串'{"News":"news", "News":"politics", "News":"breaking", "News":"stories"}',我正在尝试将其转换为字典。我已经使用json.loads()ast.literal_eval() 来转换它们,但似乎这两种方法都只采用最后一个键值对。

是否有针对此问题的单线解决方案?还是我需要更复杂的东西?

【问题讨论】:

  • 字典不能有重复的键。
  • 我知道;有没有办法将此加载到一个以“新闻”为键并加载四个单独值的字典中?
  • 您从哪里获得这些数据?当然有办法以这种方式解析它,但它不会很有趣/漂亮。

标签: python string python-2.7 dictionary


【解决方案1】:

假设该字符串是有效的 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']}

【讨论】:

  • 不错。我不知道hooks
【解决方案2】:

字典中的每个键不能有多个实例。这就是为什么您不能生成具有 4 个相同键的字典,News 对于这种情况。

考虑将数据格式更改为符合您的规范的格式,例如带有列表值的字典:

{"News": ["news", "politics", "breaking", "stories"]}

【讨论】:

  • 我也有这个想法;可能暂时是我的解决方案。
  • 许多(大多数)人没有选择更改源数据格式的选项,所以我不知道这一般适用性如何。
【解决方案3】:

您可以将defaultdictlist 一起使用:

>>> 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']}

【讨论】:

    猜你喜欢
    • 2019-06-26
    • 1970-01-01
    • 1970-01-01
    • 2011-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-19
    相关资源
    最近更新 更多