Как мне избавиться от нескольких вложенных циклов? - PullRequest
1 голос
/ 17 января 2012

У меня есть скрипт Python (3.2), который ищет точки с нужным мне свойством. Но у него есть эта уродливая часть:

for x in range(0,p):
  for y in range(0,p):
    for z in range(0,p):
      for s in range(0,p):
        for t in range(0,p):
          for w in range(0,p):
            for u in range(0,p):
              if isagoodpoint(x,y,z,s,t,w,u,p):
                print(x,y,z,s,t,w,u)
              else:
                pass

Могу ли я что-нибудь сделать, чтобы она выглядела немного лучше?

Ответы [ 2 ]

5 голосов
/ 28 октября 2012

Вы можете использовать itertools , чтобы упростить ваш код:

from itertools import product

def print_good_points(p, dimensions=7):
    for coords in product(range(p), repeat=dimensions):
        args = coords + (p,)
        if isagoodpoint(*args):
            print(*coords)

Это решает вашу проблему, как указано; однако я не уверен, что вы действительно хотели включить p в аргументы isagoodpoint(). Если нет, вы можете потерять строку, которая добавляет это:

from itertools import product

def print_good_points(p, dimensions=7):
    for coords in product(range(p), repeat=dimensions):
        if isagoodpoint(*coords):
            print(*coords)

Строки в вашем коде

else:
    pass

ничего не делать, кстати. Кроме того, range(0, p) эквивалентно range(p).

И ... на всякий случай, если вам не знакомо использование * в вызовах функций:

http://docs.python.org/3.2/reference/expressions.html#index-34

0 голосов
/ 12 апреля 2019

Вы можете использовать что-то вроде:

for x, y, z in product(range(0,p), range(0,p), range(0,p)):
    print(x,y,z)

или

for x, y, z in product(range(0,p), repeat=3):
    print(x,y,z)

Для python2.7 вам нужно from itertools import product.

...