仅将列表中的一个元素更改为float或其他转换

时间:2015-11-17 10:02:42

标签: python string list casting floating-point

假设我有这些数据:

[[u'alpha',u'0.1'],[u'bravo',u'0.2']]

我想要实现的是将每个项目的第二个元素更改为浮动

这是我的代码。它能够获得我想要的输出,但我正在寻找更简单,更通用的东西。例如,元素可能是100个中的第99个,或者我想将第一个元素更改为标题大小写。

我正在探索地图和lambda,但在这种情况下无法看到如何使用它。

#!/bin/env python

data = [[u'alpha',u'0.1'],[u'bravo',u'0.2']]

print data

tgb=[]
for item in data:
    rfv=[]
    for x,elem in enumerate(item):
            if x == 1:
                    rfv.append(float(elem))
            else:
                    rfv.append(elem)
    tgb.append(rfv)

print tgb

输出:

[[u'alpha', u'0.1'], [u'bravo', u'0.2']]
[[u'alpha', 0.1], [u'bravo', 0.2]]

2 个答案:

答案 0 :(得分:1)

让我们解决你在问题中提到的地图 lambda 切片。如果您知道要修改的索引,可以执行以下操作:

print map(lambda x,index=1:x[:index]+[float(x[index])]+x[index+1:] ,s)

请注意,我使用1作为索引的默认值。

演示:

>>s=[[u'alpha',u'0.1',u'0.1'],[u'bravo',u'0.2',u'0.1',u'0.1']]
>>print map(lambda x,index=1 : x[:index] + [float(x[index])] + x[index+1:] , s)
[[u'alpha', 0.1, u'0.1'], [u'bravo', 0.2, u'0.1', u'0.1']]

答案 1 :(得分:1)

您可以执行以下操作:

def convert(x):
    try:
        return float(x)
    except ValueError, e:
        return x.title()

data = [[u'alpha',u'0.1'], [u'bravo',u'0.2'], [u'charlie', u'0.1', u'0.2', u'0.3', u'0.4']]
data = [[convert(element) for element in entry] for entry in data]

print data

这将尝试将所有项目转换为浮点数,但如果它们无法以标题格式转换,则将它们保留为字符串。这将显示以下输出:

[[u'Alpha', 0.1], [u'Bravo', 0.2], [u'Charlie', 0.1, 0.2, 0.3, 0.4]]

这也适用于100个元素。注意,不可能将lambda用于convert()函数,因为它需要是单个表达式。

或者,map()可用于提供相同的结果:

data = [map(convert, entry) for entry in data]