如何将字符串列表中的部分内容转换为整数

5

我有一个列表的列表,像这样:

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

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

我尝试了异常循环,但好像不起作用(我不确定为什么)。 我知道它是针对子列表的,因为最初我得到了一个值错误,即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个回答

3

使用:

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]

请问这段代码应该放在哪里?我希望它被封装在行变量中,这样我就可以将最终产品放在一个定义好的函数中(例如 graph(header,rows)将有完整的输出)。 - user11359605
@Aisha 已添加 - U13-Forward

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]

0
我在你的代码中看到两个问题,都在同一行上:
[[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添加了一个好的解决方案。 我只是想解释一下为什么您的解决方案不起作用;)


非常感谢,这对于理解出了什么问题非常有帮助! - user11359605

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接