如何使用列表推导将逗号替换为包含字符串和数字的列表中的转义逗号

时间:2018-01-24 21:51:02

标签: python list-comprehension

我有一个包含字符串和数字元素的元组,我试图用转义的逗号替换存在于元组的一个元素中的逗号,例如输入如下所示

('', 'i_like_cats', 'I like, cookies', 10319708L, "* / Item ID='10319708'", 'i_wish_was_an_oscar_meyer_weiner',
0.101021321)

和我想要的输出是

('', 'i_like_cats', 'I like\, cookies', 10319708L, "* / Item ID='10319708'", 'i_wish_was_an_oscar_meyer_weiner',
0.101021321)

我想要做的是用/之后替换,因为我将内容输出到csv文件,所以当管道的下一步读取文件时,它会以逗号分隔文件'像'和' cookies'即使我不想要它。我无法修改管道下游部分的代码,因此我无法切换到分号或制表符分隔文件,我无法更改。

我尝试做的是使用列表理解来解决这个问题,如下所示

line = map(lambda x: str.replace(x, '"', '\"'), line)

但是会生成一个类型错误,指示replace需要一个字符串对象,但它收到了一个long。

我能想到的唯一解决方案是将元组分解为单个元素,修改包含逗号的元素,然后构建一个新元组并重新附加每个元素,但它似乎必须有更多的pythonic方式来做到这一点。

谢谢!

2 个答案:

答案 0 :(得分:3)

我认为列表理解最适合为每个元素应用规则;如果您知道要更改哪个单个字符串,为什么不能只更改那个单个字符串?

如果您想将所有逗号更改为转义逗号,可以尝试一下:

strtuple = ('', 'i_like_cats', 'I like, cookies', 10319708, "* / Item ID='10319708'", 'i_wish_was_an_oscar_meyer_weiner',
0.101021321)
converted_strlist = [i.replace(',', '\\,') if isinstance(i, str) else i for i in strtuple]

答案 1 :(得分:0)

您可能希望在调用replace之前验证元素是str实例。

类似的东西:

    data = (
        '',
        'i_like_cats',
        'I like, cookies',
        10319708L,
        "* / Item ID='10319708'",
        'i_wish_was_an_oscar_meyer_weiner',
        0.101021321,
    )

    line = [
        x.replace(",", "\,") if isinstance(x, str) else x for x in data
    ]