ВЫЗОВ: наиболее питонный способ вложенного цикла об одном элементе, исключая себя - PullRequest
0 голосов
/ 03 июня 2019

Я хочу иметь вложенный цикл с внутренним и внешним циклом, повторяющимся по одному и тому же списку.Также во внутреннем цикле я не хочу иметь тот же элемент, что и во внешнем цикле.Мне также нужны индексы.

Пример прямого пути

for i, line in enumerate(list_sentence):
        for j, line2 in enumerate(list_sentence):
            if i != j:
                if line in line2:
                    doing_stuff()

Поскольку строка в строке 2 говорит вам, что i и j не симметричны, так как строка в строке 2 не совпадает с строкой 2 в строкеявляется.Одно возможное решение может сделать симметричным.

Можете ли вы написать более Python решение?Этот вопрос вызван в основном любопытством.Один из способов, который я решил использовать продукт коллекций, но это сделает код менее читабельным.

Ответы [ 2 ]

2 голосов
/ 03 июня 2019

Если я правильно понял ваш вопрос, вы можете использовать itertools.permutations.Это работает, только если вы используете один и тот же массив дважды.

import itertools
list_sentence = [1, 2, 3]

for line1, line2 in itertools.permutations(list_sentence, 2):
    print(line1, line2)

Результат:

1 2
1 3
2 1
2 3
3 1
3 2

Вам нужно только заменить print(line1, line2) на if line1 in line2: doing_stuff().

1 голос
/ 03 июня 2019

По этому конкретному вопросу itertools.permutations лучше моего предложения ниже.

Один общий способ «спрятать» сложный выбор предметов для зацикливания - переместите for s и if s в генератор. Таким образом, ваш основной код с важной частью do_stuff () останется плоским. Строка документа в самом генераторе может объяснить, что происходит, если это необходимо -

def check_lines(seq):
    for i, line1 in enumerate(seq):
        for j, line2 in enumerate(seq):
             if i == j:  # keep things flat
                 continue 
             if line1 not in line2:  
                 continue
             yield (line1, line2)

и на вашем основном коде:

for line1, line2 in my_permut(list_sentence):
    # do_stuff code can go directly here, in a "flat enough" place:
    ...

Я использовал это пару раз, когда у меня был класс для представления настольной игры, такой как структура (шахматы или шахматная доска) или изображение, и использовал метод __iter__, чтобы сразу получить x, y координаты и содержимое ячейки в виде кортежа.

Вместо:

for x in board.width():
   for y in board.height():
      content = board[x, y]
      ...

код становится:

for x, y, content in board:
    ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...