[英]Convert string to int in tuple of both
假设我有一个包含字符串元组的列表。 我想将某些数字字符串转换为int。
例。 实际上,我有一个类似的列表:
ex = [('20121001', '"3"', '"04"', '39840', '2', '19', '2385',
'"FRTE"', '"Earth, LGO"', '"2.16M-2.21M"', '"GGHS 18 with extra"',
'"2074-2404"', '129', '129', '0', '2', '4', '15\r'), ('20121001',
'"3"', '"04"', '39840', '2', '20', '840', '"ERSA"', '"WLAN Router"',
'"2.16M-2.21M"', '"Router with Switch"', '"2074-2404"', '129', '129',
'0', '0', '9', '6\r')]
我想将'20121001'
类'20121001'
数字转换为int,“ 3”应保持不变,因为它是一个字符串。 我们应该怎么做?
如果你知道try
/ except
和int
功能,你应该能够写一个safe_int
返回函数int(x)
如果它成功, x
,如果它没有。
然后,要在元组中的每个元素上调用该函数,您需要遍历元组-无论是显式的for
语句,理解还是对map
的调用。 例如:
>>> ex = ('20121001', '"3"', 'Earth, LGO')
>>> new_ex = map(safe_int, ex)
在Python 2.x中,这会给您一个列表。 在3.x中,是一个迭代器; 如果您需要返回一个元组,则tuple
函数将为您转换它:
>>> new_ex = tuple(map(safe_int, ex))
>>> print(new_ex)
(20121001, '"3"', 'Earth, LGO')
但是您显然不想只处理'20121001'
,也不想处理'"3"'
。 要做到这一点,你需要首先试图解释值作为一些Python值的字符串表示,然后解释的,作为一个整数的结果。 就像是:
def safe_int(value):
try:
return int(ast.literal_eval(value))
except ValueError:
return value
该literal_eval
会变成'20121001'
到整数20121001
,和int
上直接返回。 literal_eval
将把'"3"'
变成字符串'3'
,并且该int
上的int
将返回整数3
。 literal_eval
会将'"Earth, LGO"'
转换为字符串'Earth, LGO'
,但是该int
会失败,因此您将获得原始(加引号)字符串。
这里实际上还不清楚是ast.literal_eval
还是json.loads
或您想要的其他东西。 您所有的示例碰巧都可以使用,但这不是重点。 您真正想要做的是查看生成此代码的内容 ,并编写相应的相应代码以将其反转。 (或者,最好,如果可能的话,更改生成的代码以首先生成更明智的内容……)
实际上,从您的评论看来,您要撤消的操作似乎是CSV引用。 这样做的方法是使用csv
模块, 而不是通过在每个值上调用literal_eval
。
但是,您不仅有一个元组,而且还有一个元组列表 。 因此,您需要一个嵌套循环:对于列表中的每个元组,对于元组中的每个元素,请尽可能进行整形。 例如(这一次使用推导而不是map
,只是出于多样性):
>>> ex = [('20121001', '"3"', 'Earth, LGO'), ('20121001', '"3"', 'ERSA')]
>>> new_ex = [tuple(safe_int(x) for x in tup) for tup in ex]
>>> print(new_ex)
[(20121001, '"3"', 'Earth, LGO'), (20121001, '"3"', 'ERSA')]
如果您打算从元组中的每个项目中删除一个级别的字符串化,则ast.literal_eval
可能对您ast.literal_eval
:
ex = [tuple(ast.literal_eval(i) for i in t) for t in ex]
列表理解遵循您列出的数据结构。 每次对ast.literal_eval
调用ast.literal_eval
将字符串转换为Python对象: '3'
变为3
; '"3"'
变成"3"
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.