如何将str项列表更改为float,int,bool或str,具体取决于它们是什么?

时间:2017-11-09 20:52:19

标签: python python-3.x

如果我最初列出了包含str数据的列表,我怎么能将该列表更改为str代表的内容?例如:

x = [['3.14', 'Pi and radius', '20', 'False', False', '10'],
     ['201', 'Eulers', 'True', '9.18922', 'False', '12', '90']]

x = [[3.14, 'Pi and radius', 20, False, False, 10],
     [201, 'Eulers', True, 9.18922, False, 12, 90]]

str已更改为floatintbool或保留为str的位置,具体取决于实际情况。

我认为需要for i in range(len(x))循环和if type(x) = ...,但我不确定具体细节。

4 个答案:

答案 0 :(得分:1)

您可以使用ast.literal_eval()。下面的代码演示了用法。

import ast

values = ["hello", "1", "1.5", "False"]

def real_type(value):
    try:
        return ast.literal_eval(value)
    except:
        return value

x=[real_type(i) for i in values]
print(x)
print(x[1] + x[2])

打印

  

["hello", 1, 1.5, False]
  2.5

答案 1 :(得分:0)

你可以这样做:

  

定义适用于isdigit()float的{​​{1}}函数   两者都是因为默认int仅适用于isdigit()

int

现在:

  

在一线解决方案中:

x = [['3.14', 'Pi and radius', '20', 'False', 'False', '10'],
     ['201', 'Eulers', 'True', '9.18922', 'False', '12', '90']]


def isdigit(digit):   #define your own isdigit() function which works for float and int both because default isdigit() only works for int
    try:
        float(digit)
        return 0
    except ValueError:
        return 1


check={'True':True,'False':False}  #define True , False dict

输出:

list_1=[[float(sub_item) if '.' in sub_item else int(sub_item) if isdigit(sub_item) == 0 else check.get(sub_item) if sub_item == 'True' or sub_item == 'False' else sub_item for sub_item in item]for item in x]
print(list_1)
  

详细解决方案:

以上列表理解与:

相同
[[3.14, 'Pi and radius', 20, False, False, 10], [201, 'Eulers', True, 9.18922, False, 12, 90]]

输出:

final_list=[]   # logic is from here
for item in x:
    if isinstance(item,list):
        sub_list=[]   
        #sub_list for keep tracking of nested list in origional list
        for sub_item in item:
            if isdigit(sub_item)==0:  #passing value to isdigit() function
                if '.' in sub_item:    #float contain '.' 
                    sub_list.append(float(sub_item))
                else:                  #else it will be int
                    sub_list.append(int(sub_item))
            elif sub_item=='True' or sub_item=='False': 
                sub_list.append(check.get(sub_item))  #get value from check dict
            else:
                sub_list.append(sub_item)  #else append remaining items

        final_list.append(sub_list)

print(final_list)

答案 2 :(得分:-1)

您可以定义像convert()这样的函数,并在转换中检查类型并应用转换。

\n

converted_list = [convert(i) for i in x]

转换可能是这样的(需要从ast导入literal_value):https://stackoverflow.com/a/41475449/4040842 @Shrewmouse

Shrewmouse的解决方案不需要if else语句。

答案 3 :(得分:-1)

你是对的,但是len()代替enumerate()功能,你可以使用更多的Pythonic方法:

x = [['3.14', 'Pi and radius', '20', 'False', 'False', '10'],
     ['201', 'Eulers', 'True', '9.18922', 'False', '12', '90']]

for lst in x:
    for i, val in enumerate(lst):
        try:
            val = float(val)
            if val == int(val):
                val = int(val)
        except ValueError:
            if val == "True":
               val = True
            elif val == "False":
                val = False
        lst[i] = val


print(x)

输出:

  

[[3.14,'Pi and radius',20,False,False,10],[201,'Eulers',True,9.18922,False,12,90]]