假设我有一个包含字符串元组的列表。可能有一些我希望转换为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'
之类的数字,我想将其转换为int,“3”应该保持不变,因为它是一个字符串。
我们怎么做到这一点?
答案 0 :(得分:4)
如果您了解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
,其上的3
将返回整数literal_eval
。 '"Earth, LGO"'
会将'Earth, LGO'
转换为字符串int
,但ast.literal_eval
上的json.loads
将失败,因此您将获得原始(额外引用的)字符串。
这里实际上并不清楚csv
或literal_eval
或不同之处是否是您想要的。您的所有示例都适用于任何一个,但这不是重点;你真正想要做的是查看生成此代码的内容,并编写相应的相应代码来反转它。 (或者,更好的是,如果可能的话,更改生成代码以生成更合理的内容......)
事实上,根据您的评论,您尝试撤消的内容似乎是CSV引用。这样做的方法是使用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')]
。
但是你不只是有一个元组,你有一个元组的列表。因此,您需要一个嵌套循环:对于列表中的每个元组,对于元组中的每个元素,如果可能,请进行。例如(这次使用的是理解而不是{{1}},只是为了变化):
{{1}}
答案 1 :(得分:2)
如果您要从元组中的每个项目中删除一个级别的字符串化,那么ast.literal_eval
可能适合您:
ex = [tuple(ast.literal_eval(i) for i in t) for t in ex]
列表理解遵循您列出的数据结构。每次调用ast.literal_eval
都会将字符串转换为Python对象:'3'
变为3
; '"3"'
变为"3"
。