【问题标题】:Change only one element in list to float or other transformation仅将列表中的一个元素更改为浮动或其他转换
【发布时间】:2016-02-18 15:39:16
【问题描述】:

假设我有这些数据:

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

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

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

我正在探索 map 和 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]]

【问题讨论】:

  • 如果知道要更改哪个元素,为什么还要迭代?
  • 除了迭代元素还有什么其他选择?
  • @IgnacioVazquez-Abrams 愿意分享示例吗?

标签: python string list casting floating-point


【解决方案1】:

让我们用您在问题中提到的 ma​​plambdaslicing 来解决。如果您知道要修改哪个索引,您可以这样做:

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

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

演示:

>>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']]

【讨论】:

  • 未来我可能有100个元素,我不打算写data= [[i[0],i[2],i[3], ...... i[98,]float(i[99])] for i in data ]
【解决方案2】:

您可以执行以下操作:

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 个元素。请注意,convert() 函数不能使用 lambda,因为它必须是单个表达式。

或者,map() 也可以用来给出相同的结果:

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

【讨论】:

    猜你喜欢
    • 2017-01-06
    • 2019-10-16
    • 1970-01-01
    • 1970-01-01
    • 2021-11-25
    • 2023-03-05
    • 2011-08-22
    • 2015-07-30
    • 2012-05-22
    相关资源
    最近更新 更多