Подтвердить что ты не робот

Добавить кортеж в список кортежей в Python

Я новичок в python и не знаю, как это сделать.

У меня есть список кортежей, которые представляют точки и другой список, который представляет смещения. Мне нужен набор всех комбинаций, которые это формирует. Вот код:

offsets = [( 0, 0),( 0,-1),( 0, 1),( 1, 0),(-1, 0)]
points = [( 1, 5),( 3, 3),( 8, 7)]

Таким образом, мой набор комбинированных точек должен быть

[( 1, 5),( 1, 4),( 1, 6),( 2, 5),( 0, 5),
 ( 3, 3),( 3, 2),( 3, 4),( 4, 3),( 2, 3),
 ( 8, 7),( 8, 6),( 8, 8),( 9, 7),( 7, 7)]

Я не могу использовать NumPy или любые другие библиотеки.

4b9b3361

Ответ 1

result = [(x+dx, y+dy) for x,y in points for dx,dy in offsets]

Дополнительные сведения см. в списке понятий.

Ответ 2

Довольно просто:

>>> rslt = []
>>> for x, y in points:
...     for dx, dy in offsets:
...         rslt.append( (x+dx, y+dy) )
... 
>>> rslt
[(1, 5), (1, 4), (1, 6), (2, 5), (0, 5), (3, 3), (3, 2), (3, 4), (4, 3), (2, 3), (8, 7), (8, 6), (8, 8), (9, 7), (7, 7)]

Перебирайте точки и смещения, затем создавайте новые кортежи для добавления смещений к точкам.

Ответ 3

Лично мне нравится ответ Алока. Однако для поклонников itertools эквивалент itertools (в Python 2.6 и новее):

import itertools as it
ps = [(x+dx, y+dy) for (x, y), (dx, dy) in it.product(points, offsets)]

Однако в этом случае решение itertools не быстрее, чем простое (оно на самом деле немного медленнее, потому что ему нужно разархивировать каждый x, y несколько раз для каждого смещения, тогда как Alok простой подход распаковывается каждый x, y, но один раз). Тем не менее, itertools.product - отличная альтернатива вложенным петлям в других случаях, поэтому, стоит знать об этом! -)

Ответ 4

Если вам не нужны дубликаты в результате:

result = []
for ox, oy in offsets:
    for px, py in points:
        result.append((px + ox, py + oy))

Если вы заботитесь о дубликатах в результате:

result = set()
for ox, oy in offsets:
    for px, py in points:
        result.add((px + ox, py + oy))