当给出数据列表时,我被要求将列表中的字符串转换为相应的类型,如果字符串包含整数,则为int;如果不包含整数,则为float。但是我遇到了这个问题,它将转换值,但它不会改变列表中的原始值。
例如,如果给出:
d = [['abc', '123', '45.6', 'True', 'False']]
转换后应该看起来像这样:
[['abc', 123, 45.6, True, False]]
到目前为止,我已经尝试编写for循环并以这种方式转换值,但正如我所提到的,它并没有改变原始列表:
for lst in data:
for index in lst:
if index.isdigit():
index = int(index)
elif not index.isdigit():
index = float(index)
我不确定如何解决这个问题,或者是否有另一种方法可以解决这个问题。任何帮助,将不胜感激!谢谢:)
答案 0 :(得分:5)
您需要使用列表订阅更新初始索引处的项目,即在投射项目后分配给每个索引。您可以使用enumerate
执行此操作,ast.literal_eval
为列表中的每个项目提供相应的索引:
import ast
d = [['abc', '123', '45.6', 'True', 'False']]
for lst in d:
for i, x in enumerate(lst):
try:
lst[i] = ast.literal_eval(x)
except (ValueError, SyntaxError):
lst[i] = x
print(d)
# [['abc', 123, 45.6, True, False]]
EAFP尝试将每个字符串项解析为Python文字,如果失败(有错误),则恢复为原始项(请参阅)。
如果你有大量的这些字符串,那么编写你自己的解析器会更快(虽然编码更简洁,可能容易出错)但是,让{{1}更好完成所有脏的工作。
答案 1 :(得分:1)
这里没有任何库。只是切片的东西和一些尝试 - 除了技巧。 isdigit()
检查string
是digit
是否为float
,如果不是{},则表示True
。对于False
和all = [['abc', '123', '45.6', 'True', 'False']]
for d in all:
for x,y in enumerate(d):
if y == "True":
d[x] = True
if y == "False":
d[x] = False
for d in all:
for x,y in enumerate(d):
try:
if y.isdigit() == True:
d[x] = int(y)
else:
d[x] = float(y)
except:
pass
,只需检查它们是否在列表中。
这可以做得更短,我只是这样做,所以你可以看到它是如何工作的。
['abc', 123, 45.6, True, False]
abc
<class 'str'>
123
<class 'int'>
45.6
<class 'float'>
True
<class 'bool'>
False
<class 'bool'>
输出;
row_number()
答案 2 :(得分:0)
试试这个(不需要图书馆):
data = [['abc', '123', '45.6', 'True', 'False']]
def isfloat(x):
try:
a = float(x)
except ValueError:
return False
else:
return True
def isint(x):
try:
a = float(x)
b = int(a)
except ValueError:
return False
else:
return a == b
for counter1, box in enumerate(data):
for counter2, items in enumerate(box):
if isfloat(items) is True:
data[counter1][counter2] = float(items)
elif isint(items) is True:
data[counter1][counter2] = float(items)
elif items == "True":
data[counter1][counter2] = True
elif items == "False":
data[counter1][counter2] = False
else:
pass
print(data)