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

时间:2017-11-24 03:26:33

标签: python python-2.7

输入:

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

5 个答案:

答案 0 :(得分:3)

'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

答案 1 :(得分:1)

这个怎么样:

def to_float(s):
    try:
        return float(s)
    except:
        return s

[[to_float(s) for s in row] for row in data]

答案 2 :(得分:1)

你的变量i,一个整数,永远不会等于[1,2],一个列表。 你想说/写的意思是:

if i not in [1,2]:

编辑: 我忘记了第一排。 由于您的第一行与其他行不同,要么采用不同的方式处理(不推荐),要么使用其他答案之一(推荐)

答案 3 :(得分:1)

您可以使用map:

应用具有条件的lambda函数
for i,d in enumerate(data):
    data[i] = map(lambda x: float(x) if x.isdigit() else x, d)

map在d的每个子元素上应用lambda函数。如果元素是表示数字的字符串,则使用float应用转换,如果不是,则保留整个字符串。它直接替换数据中的子列表。

在Python 3.X中,地图的结果需要显式转换为列表,即data[i] = list(map())

答案 4 :(得分:0)

您可以尝试使用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]