Итерация по массиву при выполнении операции над всеми последующими элементами - PullRequest
0 голосов
/ 11 июня 2019

У меня есть массив точек. Для каждой точки я хочу нарисовать линию, пересекающую текущую точку и каждую последующую точку.

Чтобы сделать это эффективно, я хотел убедиться, что правильно использовать итераторы Python. Я думал о том, чтобы сделать что-то вроде этого:

i = 0
for p in points:
    head, *tail = points[i::]
    pairs = itertools.combinations(head, tail) # this is obviously wrong
    for (p1, p2) in pairs:
        get_line(p1, p2)
    i += 1

Но я не смог найти метод в itertools, который возвращает: (Head, Tail [0]); (Голова, хвост [1]) ... и т. Д.

Какой эффективный способ сделать это?

Ответы [ 2 ]

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

Похоже, вы просто хотите повторить комбинации.Примерно так получится строка для каждой пары точек:

from itertools import combinations

points = [1, 2, 3, 4]

def get_line(p1, p2):
    print("line", p1, p2)

for pair in combinations(points, 2):
    get_line(*pair)

отпечатков:

line 1 2
line 1 3
line 1 4
line 2 3
line 2 4
line 3 4
0 голосов
/ 11 июня 2019
import itertools

points = ['p1', 'p2', 'p3', 'p4']

for i, point1 in enumerate(points):
    for point2 in itertools.islice(points, i+1, None):  # iterator slicing
        print(point1, point2)

выход

p1 p2
p1 p3
p1 p4
p2 p3
p2 p4
p3 p4
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...