如何仅将字符串列表的一部分转换为整数

时间:2019-08-07 06:50:11

标签: python python-3.x list int

我有一个列表列表,如:

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

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

我尝试了一个异常循环,该循环似乎不起作用(我不确定为什么)。 我知道它以子列表为目标,因为最初我遇到int()的值错误,无法识别以10为底的'c'(子列表的第一个元素中的第一个字母。

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来定位列表,因为它更改了分割最终数据的方式)。我在想,如果我无法解决这个问题,我可能会尝试使用完整列表到元组的转换,以及字符的异常循环,然后尝试将其转换并拆分回列表列表。我们将不胜感激,也可以通过其他方式来获得此结果。

谢谢!

3 个答案:

答案 0 :(得分:4)

使用:

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]

答案 1 :(得分: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]

答案 2 :(得分:1)

我在您的代码中看到两个问题,都在同一条通道上

[[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添加了一个不错的解决方案。我只是想解释一下为什么您的解决方案不起作用;)