【问题标题】:How to go through a string and turn into dictionary如何遍历字符串并变成字典
【发布时间】:2020-12-13 16:29:47
【问题描述】:

我有一个如下所示的字符串:

"buyer=Bob&seller=Jan&id_a=234"

我想把它转换成字典:

{"买家":"Bob", "卖家":"Jan", "id_a":234}

但是,此字符串可以按任何顺序出现,因此它也可以类似于“seller=Jan&buyer=Bob&id_a=234”。当然,这仍然会产生相同的字典。

如何在 python 中轻松做到这一点?起初我使用的是 .split(),但是当我意识到有多种可能的排序时,我将不得不创建一个超级混乱的解决方案来适应这种情况。有什么想法吗?

【问题讨论】:

    标签: python string parsing


    【解决方案1】:

    您有许多键值对,全部由& 分隔。键和值本身由= 分隔。这听起来像是string.split() 的理想用例:

    input_string = "buyer=Bob&seller=Jan&id_a=234&other=abc=7"
    
    my_dict = {}
    for keyval in input_string.split("&"):
        (key, val) = keyval.split("=", 1)
        my_dict[key] = val
    
    print(my_dict)
    

    输出是:

    {'buyer': 'Bob', 'seller': 'Jan', 'id_a': '234', 'other': 'abc=7'}
    

    这首先将整个键/值集拆分为单独的键/值项,然后为每个项提取键和值,并将它们添加到您的字典中。输入字符串中键/值项的重新排序没有问题,因为字典没有排序。

    唯一的“偷偷摸摸”位是限制键/值拆分,以确保只有 first = 字符是拆分的那个。

    【讨论】:

      【解决方案2】:

      您可以使用urllib.parse.parse_qs

      parse_qs 将解析作为字符串参数(application/x-www-form-urlencoded 类型的数据)给出的查询字符串,并将数据作为字典返回。字典键是唯一的查询变量名称,值是每个名称的值列表。

      >>> import urllib.parse
      >>> urllib.parse.parse_qs("buyer=Bob&seller=Jan&id_a=234")
      {'buyer': ['Bob'], 'seller': ['Jan'], 'id_a': ['234']}
      

      您还可以使用urllib.parse.parse_qsl,它将解析作为字符串参数(application/x-www-form-urlencoded 类型的数据)给出的查询字符串并返回名称、值对的列表。

      >>> urllib.parse.parse_qsl("buyer=Bob&seller=Jan&id_a=234")
      [('buyer', 'Bob'), ('seller', 'Jan'), ('id_a', '234')]
      

      【讨论】:

        【解决方案3】:

        如果您想使用“基础”Python 来执行此操作,而无需查询字符串解析库,我们可以尝试使用 re.findall

        inp = "buyer=Bob&seller=Jan&id_a=234"
        matches = re.findall(r'([^=&]+)=([^=&]+)', inp)
        dict_1 = dict()
        
        for key, value in matches: 
            dict_1.setdefault(key, []).append(value) 
        print(dict_1)
        

        打印出来:

        {'buyer': ['Bob'], 'id_a': ['234'], 'seller': ['Jan']}
        

        【讨论】:

          猜你喜欢
          • 2019-05-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-01-13
          • 2018-07-04
          • 2017-01-18
          相关资源
          最近更新 更多