如果我最初列出了包含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
已更改为float
,int
,bool
或保留为str
的位置,具体取决于实际情况。
我认为需要for i in range(len(x))
循环和if type(x) = ...
,但我不确定具体细节。
答案 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]]