清理笨重的循环

时间:2018-03-21 18:01:52

标签: python arrays for-loop

我正在寻找一种更好的方法来清理这个笨重的嵌套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
...

上面的代码片段提供了所需的输出,但肯定不是非常pythonic。

2 个答案:

答案 0 :(得分:2)

虽然你可以这样做:

# 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']

我不认为将它全部压缩到一个列表中理解本质上更加py。这是一个巧妙的小技巧,但它不是一个改进。

保持你的嵌套循环,它们是直截了当的,可读的,并且不会让你的未来成为头疼的事。

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

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)]

答案 1 :(得分:0)

此功能一般可能有用:

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])