2012-10-19 62 views
5

说我有一个这样的名单:转换列表和浮动

​​

我想将数字转换列表中的成浮点同时保持字符串。

我写了这个:

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

是否有一个更高效,更简洁的方式来做到这一点?

+5

数字总是在相同的位置吗? –

回答

1

您正在更改变量的值i - >数组a的内容不会改变! 如果你想改变数组中的值,你倒是应该实现这样的:

for index, value in enumerate(a): 
    try : 
     a[index] = float(value) 
    except ValueError : 
     pass 
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

1

在try /除的方法是做它的Python的方式,但如果你真的讨厌它,看是否能成为你的目的:

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] 
+1

正则表达式?似乎有点像用霰弹枪杀死蟑螂:) –

+1

@JoelCornett哈哈,我以为OP不喜欢尝试/除了这样做的方式,所以也许对他更好。 –

0

什么是我的简单的例子:

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

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

print a 
+1

它会在'“1.0”'上破坏。不知道OP是否计划采用这些方案。 –

0

我认为这是短期和更好的方式:

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

for index,value in enumerate(a): 

    if isinstance(value,int): 

      a[index] = float(value) 

print a 

输出为: '你好', '1', '喜',2.0 '东西', '3']