String 将列表中的数据转换为正确的类型

String 将列表中的数据转换为正确的类型,string,python-3.x,list,loops,String,Python 3.x,List,Loops,如何将列表中的数据转换为正确的类型,即:如果是整数,则转换为int;如果不是整数,则转换为float;如果是真或假,则转换为bool def clean_data(data: List[list]) -> None: """Convert each string in data to an int if and only if it represents a whole number, a float if and only if it represents a number that i

如何将列表中的数据转换为正确的类型,即:如果是整数,则转换为
int
;如果不是整数,则转换为
float
;如果是真或假,则转换为
bool

def clean_data(data: List[list]) -> None:
"""Convert each string in data to an int if and only if it represents a
whole number, a float if and only if it represents a number that is not a
whole number, True if and only if it is 'True', False if and only if it is
'False', and None if and only if it is either 'null' or the empty string.

>>> d = [['abc', '123', '45.6', 'True', 'False']]
>>> clean_data(d)
>>> d
[['abc', 123, 45.6, True, False]]

如果能解决您的问题,您可以尝试一种简单化的方法:

def clean_data(data):
    return [item == 'True' if item in ['True', 'False'] else \
        int(item) if item.isdigit() else \
        None if item in ['null', ''] else \
        item if item.isalpha() else \
        float(item) for item in data]

print(clean_data(['abc', '123', '45.6', 'True', 'False']))
输出

> python3 test.py
['abc', 123, 45.6, True, False]
>
实际上,如果您需要健壮且可扩展的功能,我会为每种类型定义一个“识别器”函数,默认的“str”除外,它要么返回转换后的结果,要么返回原始字符串(或抛出错误)。我会列出这些函数,从最具体到最不具体。(例如,布尔识别器非常具体。)然后循环输入,尝试每个识别器函数,直到有人声明输入,使用其值作为结果,然后继续下一个输入。如果没有识别器声明输入,请保持原样


这样,如果您有新的内容要转换,您只需定义一个新函数来识别和转换它,并将其添加到识别器函数列表的适当位置。

如果可以解决您的问题,您可以尝试一种简单的方法:

def clean_data(data):
    return [item == 'True' if item in ['True', 'False'] else \
        int(item) if item.isdigit() else \
        None if item in ['null', ''] else \
        item if item.isalpha() else \
        float(item) for item in data]

print(clean_data(['abc', '123', '45.6', 'True', 'False']))
输出

> python3 test.py
['abc', 123, 45.6, True, False]
>
实际上,如果您需要健壮且可扩展的功能,我会为每种类型定义一个“识别器”函数,默认的“str”除外,它要么返回转换后的结果,要么返回原始字符串(或抛出错误)。我会列出这些函数,从最具体到最不具体。(例如,布尔识别器非常具体。)然后循环输入,尝试每个识别器函数,直到有人声明输入,使用其值作为结果,然后继续下一个输入。如果没有识别器声明输入,请保持原样


这样,如果您有新的内容要转换,您只需定义一个新函数来识别和转换它,并将其添加到识别器函数列表的适当位置。

从标准库中试用
ast
模块:

def clean_data(xs):
    clean_xs = list()
    for x in xs:
        try:
            converted_x = ast.literal_eval(x)
        except ValueError:
            converted_x = x

        clean_xs.append(converted_x)
    return clean_xs
这给你

> clean_data(["1", "a", "True"])
[1, "a", True]

从标准库中试用
ast
模块:

def clean_data(xs):
    clean_xs = list()
    for x in xs:
        try:
            converted_x = ast.literal_eval(x)
        except ValueError:
            converted_x = x

        clean_xs.append(converted_x)
    return clean_xs
这给你

> clean_data(["1", "a", "True"])
[1, "a", True]
试试这个:

import ast


def clean_data(l):
    l1 = []
    for l2 in l:
        l3 = []
        for e in l2:
            try:
                l3.append(ast.literal_eval(e))
            except ValueError:
                l3.append(e)
        l1.append(l3)
    return l1
试试这个:

import ast


def clean_data(l):
    l1 = []
    for l2 in l:
        l3 = []
        for e in l2:
            try:
                l3.append(ast.literal_eval(e))
            except ValueError:
                l3.append(e)
        l1.append(l3)
    return l1