如何将列表中的字符串值更改为 Python 中的浮点数
Posted
技术标签:
【中文标题】如何将列表中的字符串值更改为 Python 中的浮点数【英文标题】:How to change a string value that is in a list to a float in Python 【发布时间】:2021-11-14 05:57:01 【问题描述】:我正在尝试将列表中的数字字符串转换为浮点数,但遇到了困难,可能是因为它位于列表列表中。我无法确定修复方法。该列表稍后将转换为字典
我的列表格式如下:
[['PokedexNumber','Name','Type','Total','HP','Attack','Defense','SpecialAttack','SpecialDefense','Speed'],
['001','Bulbasaur','GrassPoison','318','45',
'49','49','65','65','45'],
['002', 'Ivysaur', 'GrassPoison', '405', '60', '62', '63', '80', '80', '60']]
我的代码是:
for i in newest_list:
try:
float(i)
except ValueError:
i
我得到的错误是:
TypeError: float() 参数必须是字符串或数字,而不是“列表”
【问题讨论】:
为什么要这样做?我想说的是,通常在 Python 中拥有一个混合类型的列表并不理想。为什么不将其保留为字符串列表? 【参考方案1】:那是因为你有一个大小为 3Xn 的二维数组
您需要添加另一个循环来遍历每个内部列表
for l in newest_list:
for string in inner_list:
try:
float(string)
except ValueError:
pass
【讨论】:
【参考方案2】:由于您有一个列表列表,请尝试添加另一个 for
循环来迭代内部列表:
L = [['PokedexNumber', 'Name', 'Type', 'Total', 'HP', 'Attack', 'Defense', 'SpecialAttack', 'SpecialDefense', 'Speed'],
['001', 'Bulbasaur', 'GrassPoison', '318', '45',
'49', '49', '65', '65', '45'],
['002', 'Ivysaur', 'GrassPoison', '405', '60', '62', '63', '80', '80', '60']]
for i in L:
## Added
for j in i:
## End
try:
float(j)
except ValueError:
j
使用列表推导,这变得更加容易:
def try_parse_float(x):
try:
return float(x)
except ValueError:
return x
vals = [(try_parse_float(j)) for i in L for j in i]
或者,受@mozway 回答的启发:
vals = [float(j) if j.isnumeric() else j for i in L for j in i]
【讨论】:
【参考方案3】:您的列表实际上是列表的列表,而不是列表,而不是字符串或数字。
一个工作的 for 循环看起来像这样
for l in newest_list:
for i in l:
try:
float(i)
except ValueError:
pass # using pass here as just using i doesn't do anything
【讨论】:
【参考方案4】:使用简单的列表推导和str.isnumeric
方法:
[[float(item) if item.isnumeric() else item for item in l] for l in newest_list]
输出:
[['PokedexNumber', 'Name', 'Type', 'Total', 'HP', 'Attack',
'Defense', 'SpecialAttack', 'SpecialDefense', 'Speed'],
[1.0, 'Bulbasaur', 'GrassPoison', 318.0, 45.0, 49.0, 49.0, 65.0, 65.0, 45.0],
[2.0, 'Ivysaur', 'GrassPoison', 405.0, 60.0, 62.0, 63.0, 80.0, 80.0, 60.0]]
【讨论】:
不错!请注意,您不需要第二个列表理解(请参阅下面的答案) @rv.kvetch 是的,你这样做,否则它会将子列表链接成一个;) 哦,是的,你是对的。哈哈【参考方案5】:通过第二个循环,您可以访问列表中的列表。 然后检查内部列表中的值是否可以转换为浮点数。 如果是,将字符串列表元素替换为浮点类型。
for idx,value in enumerate(newest_list):
for idx2, value2 in enumerate(value):
try:
float(value2)
newest_list[idx][idx2] = float(value2)
except ValueError:
pass
# To check the new types of the variables:
for idx,value in enumerate(newest_list):
for idx2, value2 in enumerate(value):
print(type(value2))
【讨论】:
以上是关于如何将列表中的字符串值更改为 Python 中的浮点数的主要内容,如果未能解决你的问题,请参考以下文章
只要新值与当前值不同,Oracle SQL 将字段的值更改为列表中的其他值?
将 Python DataFrame 中的值更改为二进制标志(For-Loop 问题)