如何将字典中的字符串值转换为 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】:为了处理int
、float
和空字符串值的可能性,我将使用列表解析、字典解析和条件表达式的组合,如下所示:
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 数据类型?的主要内容,如果未能解决你的问题,请参考以下文章