【问题标题】:looping over list of lists without nesting too much循环列表列表而不嵌套太多
【发布时间】:2012-05-24 02:42:20
【问题描述】:

所以我有一个名为 a 的列表列表,我想将该列表中的项目的索引保存在一个元组中。例如,如果a[0][0] = 1,那么我想保存(0,0) 并保存到该列表中。

现在我有 ff 代码:

z = []
for i in range(0, len(a)):
    for j in range(0, len(a)):
        if a[i][j] == '.':
            y = (i, j)
            z.append(y)

这很好用,但我想摆脱嵌套,所以我想知道是否有另一种方法可以做到这一点而不会嵌套太深。

【问题讨论】:

  • 我不知道您从更改这个相当清晰且易于理解的代码中获得多少收益。当然是 YMMV。
  • 在 Python 2.x 上,xrange() 优于 range()

标签: python list indexing


【解决方案1】:
from itertools import product
for i,j in product(range(len(a)), repeat=2):
    ...

【讨论】:

  • itertools 让你强大!实力碾压敌人! itertoolsitertoolsitertools!
  • 如果行数 != 列数,这会起作用吗?此外,锯齿状列表似乎可能存在问题。不过,我很想看看 itertools 如何解决这些问题! (我是 itertools 新手 :)
  • @Closed,你可以做product(range(len(a)), range(len(a[0])))。但不适用于锯齿状列表
【解决方案2】:

你可以使用列表推导:

z = [(ii, jj) for ii, nested in enumerate(a) for jj, val in enumerate(nested) if val == '.']

不过,我认为你对 for 循环的使用更清楚。

编辑:另外,range 默认从 0 开始。

【讨论】:

    【解决方案3】:

    像这样的一些bs:

     z = ((i,j) for i in range(0, len(a)) for j in range(0, len(a)) if a[i][j] == '.')
    

    我可能把这个搞砸了——家里没有 python,但想法是你想要一个带有 if 的嵌套列表理解

    【讨论】:

      猜你喜欢
      • 2019-04-22
      • 1970-01-01
      • 2018-01-06
      • 1970-01-01
      • 2019-06-18
      • 1970-01-01
      • 2021-01-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多