修改嵌套列表元素的优雅方法
我有一个二维列表,长得像这样:
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
- 如果你有两个或更多的列表想要一起遍历,可以试试
zip
或itertools.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风格吗?