繁体   English   中英

将字符串转换为int

[英]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 / 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上的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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM