Мне нужно перебирать кортеж индексов. все индексы должны находиться в диапазоне
[0, N)
с условием i > j
. Представленный здесь пример игрушки посвящен
только два индекса; Мне нужно будет расширить это до трех (с i > j > k
) или более.
Базовая версия такова:
N = 5
for i in range(N):
for j in range(i):
print(i, j)
и он работает отлично; выход
1 0
2 0
2 1
3 0
3 1
3 2
4 0
4 1
4 2
4 3
Я не хочу иметь еще один уровень отступов для каждого дополнительного индекса, поэтому я предпочитаю эту версию:
for i, j in ((i, j) for i in range(N) for j in range(i)):
print(i, j)
это работает отлично, делает то, что нужно, и избавляется от лишних уровень отступов.
Я надеялся иметь что-то более элегантное (для двух индексов, которые не все, что уместно, но для трех или более это становится более актуальным). То, что я придумал, таково:
from itertools import combinations
for j, i in combinations(range(N), 2):
print(i, j)
Это итерации по одной и той же паре индексов. Единственное, что разным является порядок, в котором появляются пары:
1 0
2 0
3 0
4 0
2 1
3 1
4 1
3 2
4 2
4 3
Поскольку порядок того, что я делаю с этими индексами, имеет значение, поэтому я не могу использовать это.
Есть ли элегантный, короткий, питонический способ перебора этих индексов в том же порядке, что и в первом примере? Имейте в виду, что N
будет большим, поэтому сортировка - это не то, что я хотел бы сделать.