[英]Python 2.7: Format a list within a list using for loops
輸入:
data = [['A', 'B', 'C'], ['001', 'ddd', 'eee', '10'], ['002', 'fff', 'ggg', '20']]
預期產量:
data = ['A', 'B', 'C'], [1, 'ddd', 'eee', 10], [2, 'fff', 'ggg', 20]]
我嘗試使用以下代碼,但我收到此錯誤:
ValueError:無法將字符串轉換為float:A
有誰可以指出我的錯誤?
formatted = []
for row in data:
new_row = []
for i, col in enumerate(row):
if i != [1,2]:
new_row.append(col)
new_row.append(float(col))
formatted.append(new_row)
print formatted
'pythonic'這樣做的方法是嘗試將每個元素轉換為整數,然后回退到保持字符串失敗的情況下。
formatted = []
for row in data:
new_row = []
for elem in row:
try:
new_row.append(int(elem))
except ValueError:
new_row.append(elem)
formatted.append(new_row)
print formatted
那這個呢:
def to_float(s):
try:
return float(s)
except:
return s
[[to_float(s) for s in row] for row in data]
你的變量i
,一個整數,永遠不會等於[1,2],一個列表。 你想說/寫的意思是:
if i not in [1,2]:
編輯:我忘記了第一行。 由於您的第一行與其他行不同,因此要么以不同方式處理(不推薦),要么使用其他答案之一(推薦)
您可以使用map應用具有條件的lambda函數:
for i,d in enumerate(data):
data[i] = map(lambda x: float(x) if x.isdigit() else x, d)
map
將d函數應用於d的每個子元素。 如果元素是表示數字的字符串,則使用float
應用轉換,如果不是,則保留整個字符串。 它直接替換數據中的子列表。
在Python 3.X中,map的結果需要顯式轉換為列表,即data[i] = list(map())
。
您可以嘗試使用json和regex,如下所示:
import json, re
data = [['A', 'B', 'C'], ['001', 'ddd', 'eee', '10'], ['002', 'fff', 'ggg', '20']]
data = json.dumps(data)
data = json.loads(re.sub(r'"0*(\d+)"', r'\1', data)
print (data)
輸出:
[['A', 'B', 'C'], [1, 'ddd', 'eee', 10], [2, 'fff', 'ggg', 20]]
您還提到要在每個列表后刪除逗號,這里有一種方法:
data = reduce(lambda oldList, newList: oldList + newList, data, [])
輸出:
['A', 'B', 'C', 1, 'ddd', 'eee', 10, 2, 'fff', 'ggg', 20]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.