说我有这样的清单:
a = ['hello','1','hi',2,'something','3']
我想在保留字符串的同时将列表中的数字转换为float。
我写了这个:
for i in a:
try:
i = float(i)
except ValueError:
pass
有更有效和更好的方法吗?
答案 0 :(得分: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:...
块有效且b)整齐。正如halex指出的那样,map()
不会更改列表,它会返回一个新列表,并将a
设置为等于它。
答案 1 :(得分:1)
您正在更改变量i
的值 - >数组a
的内容不会改变!
如果要更改数组中的值,则应该像这样实现:
for index, value in enumerate(a):
try :
a[index] = float(value)
except ValueError :
pass
答案 2 :(得分:1)
尝试/排除方式是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]
答案 3 :(得分:0)
我的简短例子是什么:
a = ['hello','1','hi',2,'something','3']
for i, item in enumerate(a):
if str(item).isdigit():
a[i] = float(item)
print a
答案 4 :(得分: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','hi',2.0,'某事','3']