2016-01-08 13 views
6

Ho una lista di punti con le loro coordinate, cercando in questo modo:scegliere tre valori diversi da lista in Python

[(0,1),(2,3),(7,-1) and so on.] 

Qual è il modo Pythonic per scorrere su di loro e scegliere tre diversi ogni volta? Non riesco a trovare la soluzione più semplice rispetto all'utilizzo di tre for loop come questo:

for point1 in a: 
    for point2 in a: 
     if not point1 == point2: 
     for point3 in a: 
      if not point1 == point3 and not point2 == point3: 

Così sto chiedendo aiuto.

+0

c'è sempre 'itertools', un modulo per iterare su liste – njzk2

+0

o, se si vuole farlo te stesso, 'range' renderebbe un confronto più bello – njzk2

+0

Guarda [' itertools.combinations'] (https://docs.python.org/3.5/library/itertools.html#itertools.combinations) e ['itertools.permutations '] (https://docs.python.org/3.5/library/itertools.html#itertools.permutations). –

risposta

6

È possibile utilizzare itertools.combinations:

from itertools import combinations 

for point1, point2, point3 in combinations(points, 3): 
    ... 
+1

Forse 'per punto1, punto2, punto3 in combinazioni (punti, 3): ...' sarebbe più chiaro? –

+0

@MarkDickinson Effettivamente, grazie. – Delgan

7
import random 

lst = [(0, 1), (2, 3), (7, -1), (1, 2), (4, 5)] 

random.sample(lst, 3) 

Questo sarà solo dare 3 punti scelti a caso dalla lista. Sembra che tu voglia qualcosa di diverso. Puoi chiarire?

+1

Non penso che sia ciò che l'OP si aspetta, ha detto "itera su di loro e scegli tre diversi ogni volta". – Delgan

+0

Hai ragione, non ho capito la domanda. Immagino dipenda da cosa vogliono fare con l'output – jgritty

+0

@Delgan: guardando il codice di esempio di OP, sembra davvero che sia proprio quello che vuole. –

2

Utilizzare uno set.

Supponiamo che il set iniziale di coordinate sia unico.

>> uniquechoices=[(0,1),(2,3),(7,-1) and so on.] 

Riempire un set chiamato selected fino a quando non ha dire 3 valori, usando selezione casuale

>> from random import randint 
>> selected=set([]) 
>> while len(selected) < 3: selected.add(uniquechoices[randomint(0,len(uniquechoices))]) 
Problemi correlati