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

Con*_*ean 28 python nested-lists

我有一个2D列表,如下所示:

table = [['donkey', '2', '1', '0'], ['goat', '5', '3', '2']]
Run Code Online (Sandbox Code Playgroud)

我想将最后三个元素更改为整数,但下面的代码感觉非常难看:

for row in table:
    for i in range(len(row)-1):
        row[i+1] = int(row[i+1])
Run Code Online (Sandbox Code Playgroud)

但我宁愿有一些看起来像:

for row in table:
    for col in row[1:]:
        col = int(col)
Run Code Online (Sandbox Code Playgroud)

我认为应该有一种方法来编写上面的代码,但是切片创建了一个与原始代码分开的迭代器/新列表,因此引用不会延续.

有没有办法获得更多的Pythonic解决方案?

She*_*har 20

for row in table:
    row[1:] = [int(c) for c in row[1:]]
Run Code Online (Sandbox Code Playgroud)

上面看起来更pythonic?

  • 虽然这在技术上是一个就地操作,但是在循环内部创建了两个**额外列表.第一个是由`row [1:]`slice(`map`的参数)创建的.第二个是通过使用列表推导创建的. (12认同)

MAK*_*MAK 13

尝试:

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

AFAIK,分配给list切片会强制执行操作而不是创建新操作list.

  • @Nicholas Mancuso`map`完全是pythonic.什么不是pythonic是你经常得到的混乱,当你试图堵塞一个'lambda`与它一起使用时. (2认同)
  • 虽然这在技术上是一个就地操作,但是在循环内部创建了两个**额外列表.第一个是由`row [1:]`slice(`map`的参数)创建的.第二个是由`map`创建的.对于长度为*n*的"行",空间使用量为*3n-1*.随着*n*的增加,使用简单的内环变得更加节省空间. (2认同)

gur*_*lex 8

我喜欢Shekhar回答很多.

作为一般规则,在编写Python代码时,如果发现自己编写了f or i in range(len(somelist)),那么你做错了:

  • enumerate如果您有一个列表,请尝试
  • 尝试zip或者itertools.izip如果您有2个或更多列表要并行迭代

在您的情况下,第一列是不同的,因此您不能优雅地使用枚举:

for row in table:
    for i, val in enumerate(row):
        if i == 0: continue
        row[i] = int(val)
Run Code Online (Sandbox Code Playgroud)

  • "如果你发现自己在范围内写了一个`(len(somelist)),那你就做错了" - 这可能是有人可以给学习pythonic习语的人提供的最佳建议.Python的优势在于它的可读性,当有人从像Java这样的lang过渡时,这种结构很典型,他们真的会错过在Python中工作的真正优势.+1 (7认同)