2012-03-19 74 views
1

我有嵌套的形式如下列表:嵌套列表 - 字符串为浮动

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) 

不幸的是,嵌套列表保持不变。我确定我犯了一个简单的错误,但我看不到它。任何帮助(和上下文)将不胜感激。

回答

4

重新分配名称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没有任何作用。而且,在这种情况下,不可能对后一个对象进行修改 - 字符串是不可变的。

+0

这将在这种情况下被认为是更Python,for循环或列表理解像DSM建议创建my_list2?是一个还是另一个首选?我的实际列表可以达到100,000 +行。 – donopj2 2012-03-19 18:17:13

+0

@PatrickD:这两个答案做不同的事情。我的答案中的代码突变了原来的列表。 DSM答案中的代码创建了一个新列表。另一个区别是,我的答案中的代码硬码需要转换的列,并且如果某些值无法转换,则会出错。 DSM答案中的代码尝试转换每个项目,并且如果转换成功,则使用浮点值而不是原始值。如果您需要这些语义,则此答案中的代码更快并消耗更少的内存。 – 2012-03-19 18:21:58

4

您不会影响原始列表;你只是简单地从一些元素中提取一个浮点数,然后依次给它一个名称“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] 
0

您将需要重新分配行元素,以新的计算值如

row[k] = float(item) 
1
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]]