嵌套列表 - 字符串为浮动
问题描述:
我有嵌套的形式如下列表:嵌套列表 - 字符串为浮动
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)
不幸的是,嵌套列表保持不变。我确定我犯了一个简单的错误,但我看不到它。任何帮助(和上下文)将不胜感激。
答
重新分配名称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
绑定到返回的对象。这对前面指出的对象item
没有任何作用。而且,在这种情况下,不可能对后一个对象进行修改 - 字符串是不可变的。
答
您不会影响原始列表;你只是简单地从一些元素中提取一个浮点数,然后依次给它一个名称“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)
答
for index1, row in enumerate(my_list):
for index2, item in enumerate(row):
try:
my_list[index1][index2] = (float(item))
except ValueError:
pass
print my_list
[['Some1', 2.0, 3.6000000000000001, 4.5, 'GB2', 6.0],
['Some2', 3.8999999999999999, 4.0, 5.0, 'HG5', 7.2999999999999998],
['Some3', 4.0, 5.0, 6.0999999999999996, 'H2D', 8.9000000000000004]]
这将在这种情况下被认为是更Python,for循环或列表理解像DSM建议创建my_list2?是一个还是另一个首选?我的实际列表可以达到100,000 +行。 – donopj2 2012-03-19 18:17:13
@PatrickD:这两个答案做不同的事情。我的答案中的代码突变了原来的列表。 DSM答案中的代码创建了一个新列表。另一个区别是,我的答案中的代码硬码需要转换的列,并且如果某些值无法转换,则会出错。 DSM答案中的代码尝试转换每个项目,并且如果转换成功,则使用浮点值而不是原始值。如果您需要这些语义,则此答案中的代码更快并消耗更少的内存。 – 2012-03-19 18:21:58