5

Pythonの重要な信念の1つは、フラット>ネストされていることです。ただし、複数の変数をカウントアップしている場合、複数のforループの代わりに何ができますか?私のコードはグリッドの合計を数えるためのもので、次のようになります。

def horizontal():
    for x in range(20):
        for y in range(17):
            temp = grid[x][y: y + 4]
            sum = 0
            for n in temp:
                sum += int(n)
            print sum # EDIT: the return instead of print was a mistype

これは、ネストが多すぎるように思えます。まず、Pythonの多くのネストされたループと見なされるもの(私は確かに2つのネストされたループを見たことがあります)。次に、これが非常にネストされている場合、このコードを記述する別の方法は何ですか?

4

3 に答える 3

13
from itertools import product

def horizontal():
    for x, y in product(range(20), range(17)):
        print 1 + sum(int(n) for n in grid[x][y: y + 4])

この関数を使用する必要がありsumます。もちろん、変数でシャドウイングするとできないので、次のように変更しましたmy_sum

于 2012-12-17T05:02:48.443 に答える
1
grid = [range(20) for i in range(20)]
sum(sum( 1 + sum(grid[x][y: y + 4]) for y in range(17)) for x in range(20))

上記は、コードの最初の行で作成された特定のグリッドに対して13260を出力します。sum()3回使用します。最も内側の合計は、の数値と、質問のコードに示されてgrid[x][y: y + 4]いるわずかに奇妙な初期値を合計したものです。sum = 1中央の合計は、17の可能なy値のこれらの値を合計します。外側の合計は、可能なx値の中間値を合計します。

グリッドの要素が数字ではなく文字列の場合は、次のように置き換え
sum(grid[x][y: y + 4])
ます
sum(int(n) for n in grid[x][y: y + 4]

于 2012-12-17T05:10:28.643 に答える
0

辞書を使用してパフォーマンスを大幅に最適化できます

これは別の例です:

locations = {}
for i in range(len(airports)):
    locations[airports["abb"][i][1:-1]] = (airports["height"][i], airports["width"][i])

for i in range(len(uniqueData)):
    h, w = locations[uniqueData["dept_apt"][i]]
    uniqueData["dept_apt_height"][i] = h
    uniqueData["dept_apt_width"][i] = w
于 2016-10-12T09:08:07.327 に答える