web-dev-qa-db-fra.com

Ajouter un tuple à la liste des tuples dans Python

Je suis nouveau sur python et je ne connais pas la meilleure façon de le faire.

J'ai une liste de tuples qui représentent des points et une autre liste qui représente des décalages. J'ai besoin d'un ensemble de toutes les combinaisons que cela forme. Voici du code:

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

Donc, mon ensemble de points combinés devrait être

[( 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)]

Je ne peux pas utiliser NumPy ni aucune autre bibliothèque.

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

Pour plus d'informations, voir list comprehensions .

33
Alok Singhal

Assez simple:

>>> 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)]

Parcourez les points et les décalages, puis créez de nouveaux tuples pour ajouter les décalages aux points.

14
Joel

Personnellement, j'aime la réponse d'Alok. Cependant, pour les fans de itertools , l'équivalent basé sur itertools (dans Python 2.6 et versions ultérieures) est:

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

Cependant, dans ce cas, la solution itertools n'est pas plus rapide que la simple (c'est en fait un peu plus lente car elle doit déballer chaque x, y à plusieurs reprises pour chaque décalage, tandis que l'approche simple d'Alok décompresse chaque x, y mais une fois). Pourtant, itertools.product est une excellente alternative aux boucles imbriquées dans d'autres cas, donc, ça vaut le coup de le savoir! -)

8
Alex Martelli

Si vous ne vous souciez pas des doublons dans le résultat:

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

Si vous vous souciez des doublons dans le résultat:

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