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



我有一个列表列表,例如:

[['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 定位一个列表,因为它改变了拆分最终数据的方式(。我在想如果我不能让它工作,我可能会尝试将完整列表转换为元组,并带有字符的异常循环,然后尝试将其转换并拆分回列表列表。任何帮助或理解为什么这个循环不起作用将不胜感激,或者其他获得这个结果的方法。

谢谢!

使用:

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]

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

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]

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

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

最新更新