簡體   English   中英

Python 2.7:使用for循環在列表中格式化列表

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM