【问题标题】:From a list of strings to a dictionary从字符串列表到字典
【发布时间】:2017-01-24 23:26:03
【问题描述】:

假设我有一个包含以下项目的列表:

["FOO x 2", "BAR x 11", "PERC"]

我想将此列表转换为具有以下结果的字典:

{"FOO": 2, "BAR": 11, "PERC": 1}

关于如何解决这个问题的任何想法?

【问题讨论】:

  • 为什么PERC 的值是1
  • @JimFasarakis-Hilliard 如果旁边没有乘数,则假定为“x 1”。

标签: python string python-3.x dictionary


【解决方案1】:

您可以提供对dict 的理解:

l = ["FOO x 2", "BAR x 11", "PERC"]
d = dict((tuple(map(str.strip, i.split('x'))) if 'x' in i else (i, 1) for i in l))
print(d)
{'BAR': '11', 'FOO': '2', 'PERC': 1}

虽然for-loop 在可读性方面绝对胜过它:

d = {}
for i in l:
    if 'x' in i:
        k, v = map(str.strip, i.split('x'))
        d[k] = v
    else:
        d[i] = 1

【讨论】:

    【解决方案2】:

    下面的sn-p代码可以做你想做的事情

    lst = ["FOO x 2", "BAR x 11", "PERC"];
    lst1 = list()
    for elem in lst:
        splited = elem.split('x')
        k = 0
        for stri in splited:
            k = k + 1
            if k == 1:
                v = stri
                u = 1
            else:
                u = stri
        ar = list()
        ar.append(v)
        ar.append(u)
        lst1.append(ar)
    dic = dict(lst1)
    print(dic)
    

    【讨论】:

      【解决方案3】:

      单行:

      d = {x[0].strip(): int(x[1]) for x in ((elm + 'x 1').split('x') for elm in lst)}
      
      print(d)
      

      输出:

      {'BAR': 11, 'FOO': 2, 'PERC': 1}
      

      或者,您可以利用 Python 3 中 * 的新解包功能:

      lst =  ["FOO x 2", "BAR x 11", "PERC"]
      
      res = {}
      for x in lst:
          name, *count = (x + 'x 1').split('x')
          res[name.strip()] = int(count[0])
      
      print(res)
      

      输出: {'BAR': 11, 'FOO': 2, 'PERC': 1}

      【讨论】:

        【解决方案4】:

        对动物园的另一项贡献:现在具有列表理解、拆分和if 表达式:

        pass1 = [x.split(' x ') for x in l]
        # [['FOO', '2'], ['BAR', '11'], ['PERC']]
        dict((t[0], int(t[1]) if len(t) > 1 else 1) for t in pass1)
        # {'PERC': 1, 'BAR': 11, 'FOO': 2}
        

        【讨论】:

          【解决方案5】:

          几个选项可供选择

          data = ["FOO x 2", "BAR x 11", "PERC"]
          

          res = { key : int(value) if value else 1
                  for key, sep, value in map(lambda s: s.partition(' x '), data) }
          

          res = {}
          for item in data:
              key, sep, value = item.partition(' x ')
              res[key] = int(value) if value else 1
          

          res = {}
          for item in data:
              key, *value = item.split(' x ')
              res[key] = int(value[0]) if value else 1
          

          res = {}
          for item in data:
              key, value = (item.split(' x ') + [1])[:2]
              res[key] = int(value)
          
          # Output - res
          {'FOO': 2, 'BAR': 11, 'PERC': 1}
          

          请注意,这是假设您的数据始终采用该格式,否则可能需要包含 .strip() 或其他细微更改。

          【讨论】:

            猜你喜欢
            • 2021-03-17
            • 2012-08-11
            • 1970-01-01
            • 2016-12-02
            • 1970-01-01
            • 2021-01-29
            • 1970-01-01
            • 2011-07-06
            • 1970-01-01
            相关资源
            最近更新 更多