2012-03-19 73 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]]