【问题标题】:How to convert only parts of a string list into integers如何仅将字符串列表的一部分转换为整数
【发布时间】:2019-12-14 17:46:30
【问题描述】:

我有一个列表,例如:

[['c', '2', '3', '4', 'd', '1'], ['e', '14', '16', '18', 'f', '1'], etc.]

它们都遵循相同的模式(1 个字符串,3 个数字字符串,1 个字符串,1 个数字字符串)。我想将所有数字字符串转换为整数,但这样做有困难。

我尝试了一个异常循环,但它似乎不起作用(我不确定为什么)。 我知道它最初是针对子列表的

rows = []
with open(path) as infile:
    for line in infile:
        line = line.strip()
        if not line:
            continue
        try:
            [[int(i) for i in sub] for i in rows for sub in i]
        except ValueError:
            pass
        rows.append(line.split("\t"))
del rows[0]

当我打印带有异常循环的结果时,它仍然会生成一个列表列表,就好像异常最初不存在一样。 例如

[['c', '2', '3', '4', 'd', '1'], ['e', '14', '16', '18', 'f', '1'], etc.] 

而我希望它是:

[['c', 2, 3, 4, 'd', 1], ['e', 14, 16, 18, 'f', 1], etc.]

这是一个数据集分析,所以要求它保留在这个列表格式的列表中(所以我不能只使用 rows.append 来定位一个列表,因为它改变了拆分最终数据的方式)。我在想如果我不能让它工作,我可能会尝试一个完整的列表到元组的转换,一个字符的异常循环,然后尝试将它转换并拆分回一个列表列表。非常感谢任何帮助或理解为什么这个循环不起作用,或者其他方法来获得这个结果。

谢谢!

【问题讨论】:

    标签: python python-3.x list int


    【解决方案1】:

    用途:

    print([[int(x) if x.isdigit() else x for x in i] for i in rows])
    

    完整代码:

    rows = []
    with open(path) as infile:
        for line in infile:
            line = line.strip()
            if not line:
                continue
            rows.append(line.split("\t"))
    rows = [[int(x) if x.isdigit() else x for x in i] for i in rows]
    del rows[0]
    

    【讨论】:

    • 请问这个应该放在代码的什么地方?我想将它封装在行变量中,这样我就可以将最终产品放在定义的函数中(例如,图(标题,行)将有一个完整的输出)
    • @Aisha 已添加
    【解决方案2】:

    如果您不想依赖自动检测,请遵循您的数据格式:

    inp = [['c', '2', '3', '4', 'd', '1'], ['e', '14', '16', '18', 'f', '1']]
    out = [[c1, int(d1), int(d2), int(d3), c2, int(d4)] for c1, d1, d2, d3, c2, d4 in inp]
    

    【讨论】:

      【解决方案3】:

      我在您的代码中发现了两个问题,都在同一个通道中:

      [[int(i) for i in sub] for i in rows for sub in i]
      

      首先,您使用了两次i,您可能会覆盖它的值。尝试将其中一个i 替换为不同的字母,例如j

      [[int(j) for j in sub] for i in rows for sub in i]
      

      第二个问题是,这是一个理解列表。您正在创建一个新列表,您没有更新任何列表。您应该将此列表分配给某个变量:

      rows = [[int(j) for j in sub] for i in rows for sub in i]
      

      另外,我看到用户 U10-Forward 添加了一个不错的解决方案。我只是想解释一下为什么您的解决方案不起作用;)

      【讨论】:

      • 非常感谢,这对了解什么不起作用非常有帮助!
      猜你喜欢
      • 2015-07-29
      • 1970-01-01
      • 1970-01-01
      • 2022-12-18
      • 1970-01-01
      • 1970-01-01
      • 2013-03-14
      • 1970-01-01
      • 2015-01-14
      相关资源
      最近更新 更多