在两者的元组中将字符串转换为int

时间:2014-10-14 22:33:33

标签: python

假设我有一个包含字符串元组的列表。可能有一些我希望转换为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”应该保持不变,因为它是一个字符串。 我们怎么做到这一点?

2 个答案:

答案 0 :(得分:4)

如果您了解try / exceptint函数,则应该能够编写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将失败,因此您将获得原始(额外引用的)字符串。

这里实际上并不清楚csvliteral_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"