如何将字典中的字符串值转换为 int/float 数据类型?

Posted

技术标签:

【中文标题】如何将字典中的字符串值转换为 int/float 数据类型?【英文标题】:How to convert string values from a dictionary, into int/float datatypes? 【发布时间】: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:刚刚在现场编写了代码.. 抱歉。已编辑。 【参考方案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]

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

【讨论】:

以上是关于如何将字典中的字符串值转换为 int/float 数据类型?的主要内容,如果未能解决你的问题,请参考以下文章

如何将字符串转换为字典以从中检索一个值?

如何将 NSString 转换为 NSNumber

如何在 smarty 中将 float 转换为 int

如何将不带引号的嵌套字符串字典转换为Python中的字典

将字符串中的每个字符转换为字典键

如何将 JSON 字典列表转换为 Snowflake 中的字符串列表?