Python 嵌套列表-要浮动的字符串
我有以下表单的嵌套列表:Python 嵌套列表-要浮动的字符串,python,nested-lists,Python,Nested Lists,我有以下表单的嵌套列表: my_list = [['Some1', '2', '3.6', '4.5', 'GB2', '6'], ['Some2', '3.9', '4', '5', 'HG5', '7.3'], ['Some3', '4', '5', '6.1', 'H2D', '8.9']] 每个子列表的每个元素都是一个字符串,但我想将所有纯数字字符串转换为浮点 因此,我尝试以下代码: for row in my_list: for k
my_list = [['Some1', '2', '3.6', '4.5', 'GB2', '6'],
['Some2', '3.9', '4', '5', 'HG5', '7.3'],
['Some3', '4', '5', '6.1', 'H2D', '8.9']]
每个子列表的每个元素都是一个字符串,但我想将所有纯数字字符串转换为浮点
因此,我尝试以下代码:
for row in my_list:
for k, item in enumerate(row):
if k in (1, 2, 3, 5):
item = float(item)
不幸的是,嵌套列表保持不变。我肯定我犯了一个简单的错误,但我看不出来。任何帮助(和上下文)都将不胜感激。重新指定名称
项
将永远不会更改列表。请尝试以下方法:
for row in my_list:
for k in (1, 2, 3, 5):
row[k] = float(row[k])
请注意,Python名称只是附加到某些对象的标记。线条
item = float(item)
将计算
float(item)
,然后将名称item
绑定到返回的对象。这对前面指向的对象项
没有任何作用。此外,在这种情况下,不可能对后一个对象进行适当的变异——字符串是不可变的。重新指定名称项
将永远不会更改列表。请尝试以下方法:
for row in my_list:
for k in (1, 2, 3, 5):
row[k] = float(row[k])
请注意,Python名称只是附加到某些对象的标记。线条
item = float(item)
将计算
float(item)
,然后将名称item
绑定到返回的对象。这对前面指向的对象项
没有任何作用。此外,在这种情况下,不可能对后一个对象进行适当的变异——字符串是不可变的;您只需从一些元素中创建一个float,然后依次为其命名为“item”。你可以用像这样的东西
row[k] = float(item)
def floatify(x):
try:
return float(x)
except ValueError:
return x
my_list2 = [[floatify(x) for x in row] for row in my_list]
row[k] = float(item)
但我可能会这样做
row[k] = float(item)
def floatify(x):
try:
return float(x)
except ValueError:
return x
my_list2 = [[floatify(x) for x in row] for row in my_list]
row[k] = float(item)
您没有影响原始列表;您只需从一些元素中创建一个float,然后依次为其命名为“item”。你可以用像这样的东西
row[k] = float(item)
def floatify(x):
try:
return float(x)
except ValueError:
return x
my_list2 = [[floatify(x) for x in row] for row in my_list]
row[k] = float(item)
但我可能会这样做
row[k] = float(item)
def floatify(x):
try:
return float(x)
except ValueError:
return x
my_list2 = [[floatify(x) for x in row] for row in my_list]
row[k] = float(item)
您需要将行元素重新指定给新的计算值,例如
您需要将行元素重新指定给新的计算值,例如
在这种情况下,像DSM建议的那样创建my_list2的for循环或列表理解,哪一个会被认为更像Pythonic?你喜欢其中一个还是另一个?我的实际列表可以达到100000多行。@PatrickD:这两个答案有不同的作用。我的答案中的代码改变了原来的列表。DSM答案中的代码创建了一个新列表。另一个区别是,我的答案中的代码硬编码要转换的列,如果某些值无法转换,则会出错。DSM答案中的代码尝试转换每个项目,如果转换成功,则使用浮点值而不是原始值。如果您需要这些语义,那么这个答案中的代码速度更快,占用的内存更少。在这种情况下,像DSM建议的那样创建my_list2的for循环或列表理解会被认为更具Pythonic风格?你喜欢其中一个还是另一个?我的实际列表可以达到100000多行。@PatrickD:这两个答案有不同的作用。我的答案中的代码改变了原来的列表。DSM答案中的代码创建了一个新列表。另一个区别是,我的答案中的代码硬编码要转换的列,如果某些值无法转换,则会出错。DSM答案中的代码尝试转换每个项目,如果转换成功,则使用浮点值而不是原始值。如果您需要这些语义,那么这个答案中的代码速度更快,占用的内存更少。