【问题标题】:Clean up clunky for loop清理笨重的 for 循环
【发布时间】:2018-08-31 00:02:58
【问题描述】:

我正在寻找一种更好的方法来清理我拥有的这个笨重的嵌套 for 循环。

names = ['name1', 'name2', 'name3', ...]
values = [[1, 2, 3, ...], [10, 20, 30, ...], [100, 200, 300, ...]]

for i in range(len(values[0])):
    for name, value in zip(names, values):
        print(name, value[i])

输出:

name1 1
name2 10
name3 100
name1 2
name2 20
name3 200
name1 3
name2 30
name3 300
...

上面的 sn-p 给出了想要的输出,但肯定不是很pythonic。

【问题讨论】:

标签: python arrays for-loop


【解决方案1】:

虽然您可以这样做:

# assuming your "values" list can be generated dynamically
def values(how_many):
    for i in range(1, how_many + 1):
        yield [i * 10 ** pow for pow in range(0, how_many)]


names = ['name1', 'name2', 'name3']
[name + ' ' + str(val) for vals in values(len(names)) for name, val in zip(names, vals)]

生成这个值列表:

['name1 1', 'name2 10', 'name3 100', 'name1 2', 'name2 20', 'name3 200', 'name1 3', 'name2 30', 'name3 300']

我不认为将其全部压缩到一个列表理解中本质上更符合 Python 风格。这是一个巧妙的小技巧,但不是改进。

保持你的嵌套循环,它们是直接的、可读的,不会让你未来的自己头疼。


假设您的值列表是静态的,就像您的示例所示,我认为这也不是很大的改进。

names = ['name1', 'name2', 'name3']
values = [[1, 2, 3], [10, 20, 30], [100, 200, 300]]

[name + ' ' + str(value[i]) for i in range(len(values[0])) for name, value in zip(names, values)]

【讨论】:

    【解决方案2】:

    一般来说,此功能可能会有所帮助:

    def nested_indices(lol, indices_so_far=None):
        indices_so_far = indices_so_far or []
        if not isinstance(lol, list):
            yield indices_so_far
            return
        for i in range(len(lol)):
            for ni in nested_indices(lol[i], indices_so_far + [i]):
                yield ni
    

    现在你可以做这样的事情了:

    for i,j in nested_indices(values):
      print(names[i], values[i][j])
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-07-17
      • 2023-03-05
      • 2010-10-04
      • 1970-01-01
      • 1970-01-01
      • 2019-06-30
      • 1970-01-01
      • 2020-10-18
      相关资源
      最近更新 更多