【问题标题】:Filter Dictionary 'like' string过滤字典“喜欢”字符串
【发布时间】:2020-12-06 14:15:10
【问题描述】:

我正在为供应商 API 构建一个 python 脚本。我在响应正文中收到以下返回:

[
  {
    "ID": 3189,
    "DefID": 17,
    "Value": "Newspaper",
    "Name": null,
    "ForeignKey": 54245074
  },
  {
    "ID": 3190,
    "DefID": 17,
    "Value": "Newspaper",
    "Name": null,
    "ForeignKey": 604567819
  },
  {
    "ID": 3191,
    "DefID": 18,
    "Value": "TV",
    "Name": null,
    "ForeignKey": 1169994785
  },
  etc.

类型原来是<class bytes>,我已经通过使用转换为<class str>

data_str = data_bytes.decode('utf-8')

然后我尝试将其转换为字典,但由于格式原因,这不起作用。

data_dict = json.loads(data_str)

如何通过DefID 过滤来创建ForeignKeys 及其对应的Value 的字典?

例子:

#for defID = 17
data_dict17 = {54245074:"Newspaper", 604567819:"Newspaper"}

#for defID = 18
data_dict18 = {1169994785:"TV"}

感谢任何帮助!

【问题讨论】:

  • ...我在这里没有看到问题。你能澄清一下吗?
  • 如何创建一个字典,其键为ForeignKeys,值为Value,其中DefID 是一个特定数字,给定上述格式str
  • 我认为您必须继续尝试将其转换为 json 格式,因为这是正确的方法。
  • 请包含您想要的输出格式
  • 抱歉,改变了我的结构。

标签: python string dictionary


【解决方案1】:

与其拥有很多不同的变量,不如将它们放在自己的字典中:

from collections import defaultdict
data_dict = defaultdict(dict)

for d in json.loads(data_str):
    data_dict[d['DefID']][d['ForeignKey']] = d['Value']

结果:

>>> data_dict
defaultdict(<class 'dict'>, {17: {54245074: 'Newspaper', 604567819: 'Newspaper'}, 18: {1169994785: 'TV'}})

如果您更喜欢普通的dict,可以在末尾使用data_dict = dict(data_dict)

【讨论】:

    【解决方案2】:

    看来你需要一个 groupby DefID

    data = [
      {
        "ID": 3189,
        "DefID": 17,
        "Value": "Newspaper",
        "Name": None,
        "ForeignKey": 54245074
      },
      {
        "ID": 3190,
        "DefID": 17,
        "Value": "Newspaper",
        "Name": None,
        "ForeignKey": 604567819
      },
      {
        "ID": 3191,
        "DefID": 18,
        "Value": "TV",
        "Name": None,
        "ForeignKey": 1169994785
      }
    ]
    
    res = {}
    for i in data:
        res.setdefault(i['DefID'], dict()).update({i["ForeignKey"]: i['Value']})
        #OR
        #res.setdefault(i['DefID'], []).append({i["ForeignKey"]: i['Value']})
    
    print(res[17])  # --> {54245074: 'Newspaper', 604567819: 'Newspaper'}
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-08-14
      • 1970-01-01
      • 1970-01-01
      • 2019-04-17
      • 2017-03-27
      • 2019-05-06
      • 2019-05-08
      相关资源
      最近更新 更多