Ищите разрядное смещение, поскольку это - в основном все, что необходимо сделать для свопинга от мало-> обратный порядок байтов. Тогда в зависимости от диаметра долота, Вы изменяетесь, как Вы делаете разрядное смещение.
result = [(x+dx, y+dy) for x,y in points for dx,dy in offsets]
Подробнее см. понимание списка .
Если вас не интересуют дубликаты в результате:
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))
Лично мне нравится ответ Алока. Однако для поклонников 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 - отличная альтернатива вложенным циклам в других случаях, так что об этом стоит знать! -)
Довольно просто:
>>> 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)]
Перебирайте точки и смещения, затем создайте новые кортежи, добавляя смещения к точкам.