5

假设我有一个这样的列表:

a = ['hello','1','hi',2,'something','3'] 

我想在保留字符串的同时将列表中的数字转换为浮点数。

我写了这个:

for i in a:
    try:
        i = float(i)
    except ValueError:
        pass

有没有更有效和更简洁的方法来做到这一点?

4

5 回答 5

4

根据您已经尝试过的:

a = ['hello', '1.0', 'hi', 2, 'blah blah', '3']

def float_or_string(item):
    try:
        return float(item)
    except ValueError:
        return item


a = map(float_or_string, mylist)

应该做的伎俩。我想说一个try:... except:...块既a)高效又b)整洁。正如halex指出的那样,map()不会更改列表,它会返回一个新列表,并且您设置a为等于它。

于 2012-10-19T06:38:16.540 回答
1

try/except 方式是 Pythonic 的方式,但如果你真的讨厌它,看看这是否符合你的目的:

a = ['hello','1','hi',2,'something','3']  

pattern = re.compile(r'^(-?\d+)(\.\d+)?') 

b = [float(item) if isinstance(item, str) and re.match(pattern, item) 
else item for item in a] 
于 2012-10-19T06:40:45.967 回答
1

您正在更改变量的值i-> 数组的内容a没有改变!如果你想改变数组中的值,你应该像这样实现它:

for index, value in enumerate(a):
    try :
        a[index] = float(value)
    except ValueError :
        pass
于 2012-10-19T06:35:48.830 回答
0

我的简短示例是什么:

a = ['hello','1','hi',2,'something','3']

for i, item in enumerate(a):
    if str(item).isdigit():
        a[i] = float(item)

print a
于 2012-10-19T06:45:37.333 回答
0

我认为这是简短而更好的方法:

a = ['hello','1','hi',2,'something','3']

for index,value in enumerate(a):

     if isinstance(value,int):

             a[index] = float(value)

print a

输出是:['hello', '1', 'hi', 2.0, 'something', '3']

于 2012-10-19T11:30:28.063 回答