在Python中,如何将列表列表中的字符串转换为其他类型,如整数,浮点数,布尔值等?

时间:2017-10-29 19:21:05

标签: python python-3.x

当给出数据列表时,我被要求将列表中的字符串转换为相应的类型,如果字符串包含整数,则为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)

我不确定如何解决这个问题,或者是否有另一种方法可以解决这个问题。任何帮助,将不胜感激!谢谢:)

3 个答案:

答案 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文字,如果失败(有错误),则恢复为原始项(请参阅Correct output)。

如果你有大量的这些字符串,那么编写你自己的解析器会更快(虽然编码更简洁,可能容易出错)但是,让{{1}更好完成所有的工作。

答案 1 :(得分:1)

这里没有任何库。只是切片的东西和一些尝试 - 除了技巧。 isdigit()检查stringdigit是否为float,如果不是{},则表示True。对于Falseall = [['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)