【问题标题】:How to convert string values from a dictionary, into int/float datatypes?如何将字典中的字符串值转换为 int/float 数据类型?
【发布时间】:2011-07-16 01:28:00
【问题描述】:

我有一个字典列表如下:

list = [ { 'a':'1' , 'b':'2' , 'c':'3' }, { 'd':'4' , 'e':'5' , 'f':'6' } ]

如何将列表中每个字典的值转换为 int/float?

这样就变成了:

list = [ { 'a':1 , 'b':2 , 'c':3 }, { 'd':4 , 'e':5 , 'f':6 } ]

谢谢。

【问题讨论】:

  • 非常不鼓励将变量命名为内置类型。希望这只是为了示例的目的,但如果不是,您应该在代码中避免这种情况。
  • 请将您的代码从list = [ { 'a':1 , 'b':2 , 'c':3 }}, { 'd':4 , 'e':5 , 'f':6 } ] 修改为list = [ { 'a':1 , 'b':2 , 'c':3 }, { 'd':4 , 'e':5 , 'f':6 } ]
  • @Guandalino:刚刚在现场编写了代码.. 抱歉。已编辑。

标签: python string list dictionary int


【解决方案1】:

必须爱列表理解。

[dict([a, int(x)] for a, x in b.items()) for b in list]

(备注:对于仅 Python 2 的代码,您可以使用“iteritems”而不是“items”)

【讨论】:

  • 虽然同意令人印象深刻,但很难消化!如何处理:ValueError: empty string for float() for floating and ValueError: invalid literal for int() with base 10: '0.6' for 'integering'?
  • 最后我想对列表项进行统计。 (最大值、最小值、平均值、标准差)
  • 您可以编写一个函数来替换理解中的 int() 调用,以允许您想要的所有例外。
  • 有可能,但我宁愿使用 Perl :P
【解决方案2】:
for sub in the_list:
    for key in sub:
        sub[key] = int(sub[key])

将其转换为 int 而不是字符串。

【讨论】:

  • 哈哈,我只是在改变它,但是,是的,Jochen 没看错,整个将你的字典命名为一个列表,让我一时糊涂。
【解决方案3】:

如果这是您的确切格式,您可以浏览列表并修改字典。

for item in list_of_dicts:
    for key, value in item.iteritems():
        try:
            item[key] = int(value)
        except ValueError:
            item[key] = float(value)

如果您有更通用的内容,则必须对字典进行某种递归更新。检查元素是否为字典,如果是,则使用递归更新。如果它能够转换为浮点数或整数,则将其转换并修改字典中的值。没有内置函数,它可能非常丑陋(而且非 Pythonic,因为它通常需要调用 isinstance)。

【讨论】:

    【解决方案4】:

    对于python 3,

        for d in list:
            d.update((k, float(v)) for k, v in d.items())
    

    【讨论】:

      【解决方案5】:

      如果您决定采用“就地”解决方案,您可以看看这个:

      >>> d = [ { 'a':'1' , 'b':'2' , 'c':'3' }, { 'd':'4' , 'e':'5' , 'f':'6' } ]
      >>> [dt.update({k: int(v)}) for dt in d for k, v in dt.iteritems()]
      [None, None, None, None, None, None]
      >>> d
      [{'a': 1, 'c': 3, 'b': 2}, {'e': 5, 'd': 4, 'f': 6}]
      

      顺便说一句,键顺序没有被保留,因为这是标准字典的工作方式,即没有顺序的概念。

      【讨论】:

        【解决方案6】:

        为了处理intfloat 和空字符串值的可能性,我将使用列表解析、字典解析和条件表达式的组合,如下所示:

        dicts = [{'a': '1' , 'b': '' , 'c': '3.14159'},
                 {'d': '4' , 'e': '5' , 'f': '6'}]
        
        print [{k: int(v) if v and '.' not in v else float(v) if v else None
                    for k, v in d.iteritems()}
                       for d in dicts]
        
        # [{'a': 1, 'c': 3.14159, 'b': None}, {'e': 5, 'd': 4, 'f': 6}]
        

        但是,直到 2.7 版本才将字典推导式添加到 Python 2。它仍然可以在早期版本中作为单个表达式完成,但必须使用 dict 构造函数编写,如下所示:

        # for pre-Python 2.7
        
        print [dict([k, int(v) if v and '.' not in v else float(v) if v else None]
                    for k, v in d.iteritems())
                        for d in dicts]
        
        # [{'a': 1, 'c': 3.14159, 'b': None}, {'e': 5, 'd': 4, 'f': 6}]
        

        请注意,无论哪种方式,这都会创建一个新的列表字典,而不是就地修改原始字典(这需要以不同的方式完成)。

        【讨论】:

        • 如果 v='' ,我可以在现场编辑“v”,即空项目吗?会试试看。谢谢。有帮助。
        • 关于处理空“v”项的问题:您可以重写if 表达式来处理它们,正如我在修改后的答案中所示。
        • 关于在... for k... 出现语法错误的第二个问题,字典解析需要 Python 2.7+ 或 3.1+,因此使用早期版本可能会导致问题。
        • 跟进我的最后一条评论:您可以将@Powertieke 的答案中的int(x) 替换为类似于我的条件表达式,以摆脱字典理解并产生可用于早期版本的 Python。
        【解决方案7】:
          newlist=[]                       #make an empty list
          for i in list:                   # loop to hv a dict in list  
             s={}                          # make an empty dict to store new dict data 
             for k in i.keys():            # to get keys in the dict of the list 
                 s[k]=int(i[k])        # change the values from string to int by int func
             newlist.append(s)             # to add the new dict with integer to the list
        

        【讨论】:

          【解决方案8】:

          基于this answer 使用this number converter 的更通用方式。

          def number(a, just_try=False):
              try:
                  # First, we try to convert to integer.
                  # (Note, that all integer can be interpreted as float and hex number.)
                  return int(a)
              except:
                  # The order of the following convertions doesn't matter.
                  # The integer convertion has failed because `a` contains hex digits [x,a-f] or a decimal
                  # point ['.'], but not both.
                  try:
                      return int(a, 16)
                  except:
                      try:
                          return float(a)
                      except:
                          if just_try:
                              return a
                          else:
                              raise
          
          
          # The conversion:
          [dict([a, number(x)] for a, x in b.items()) for b in list]
          

          这将处理整数、浮点数和十六进制格式。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2012-06-15
            • 1970-01-01
            • 2021-05-02
            • 1970-01-01
            • 2021-12-20
            • 1970-01-01
            • 2023-03-12
            • 2016-02-28
            相关资源
            最近更新 更多