修改嵌套列表元素的优雅方法

28 投票
7 回答
38558 浏览
提问于 2025-04-16 15:47

我有一个二维列表,长得像这样:

table = [['donkey', '2', '1', '0'], ['goat', '5', '3', '2']]

我想把最后三个元素改成整数,但下面的代码看起来很丑:

for row in table:
    for i in range(len(row)-1):
        row[i+1] = int(row[i+1])

我更希望能写成这样:

for row in table:
    for col in row[1:]:
        col = int(col)

我觉得应该有办法写出上面的代码,但切片会创建一个新的迭代器或列表,这样就和原来的不一样了,所以引用的内容不会保留。

有没有什么更符合Python风格的解决方案呢?

7 个回答

8

我很喜欢Shekhar的回答。

一般来说,当你在写Python代码时,如果你发现自己在写 for i in range(len(somelist)),那就说明你可能写错了:

  • 如果你只有一个列表,可以试试用 enumerate
  • 如果你有两个或更多的列表想要一起遍历,可以试试 zipitertools.izip

在你的情况下,第一列是不同的,所以你不能优雅地使用enumerate:

for row in table:
    for i, val in enumerate(row):
        if i == 0: continue
        row[i] = int(val)
13

试试这个:

>>> for row in table:
...     row[1:]=map(int,row[1:])
... 
>>> table
[['donkey', 2, 1, 0], ['goat', 5, 3, 2]]

据我所知,把值赋给一个 list 的切片会直接在原来的列表上进行操作,而不是创建一个新的 list

20
for row in table:
    row[1:] = [int(c) for c in row[1:]]

上面的代码看起来更像是Python风格吗?

撰写回答