Se hanno una lista in questo modo:modo veloce di stringhe di attraversamento in una lista
shops=['A','B','C','D']
e vorrebbe creare i seguenti nuovi elenchi (io attraverso ogni elemento con tutti gli altri e creare una stringa in cui prima parte è alfanumerico prima del secondo):
['A-B', 'A-C', 'A-D']
['A-B', 'B-C', 'B-D']
['A-C', 'B-C', 'C-D']
['A-D', 'B-D', 'C-D']
ho qualcosa di simile a questo:
for a in shops:
cons = []
for b in shops:
if a!=b:
con = [a,b]
con = sorted(con, key=lambda x: float(x))
cons.append(con[0]+'-'+con[1])
print(cons)
Tuttavia, questo è pr lento per grandi elenchi (ad es. 1000 dove ho 1000 * 999 * 0,5 uscite). Stavo cercando un modo più efficiente per farlo?
Avrei potuto usare una clausola if-else per l'ordinamento, ad es.
for a in shops:
cons = []
for b in shops:
if a<b:
cons.append(a+"-"+b)
elif a>b:
cons.append(b+"-"+a)
print(cons)
Il che, non ho ancora cronometrato - ma ho pensato che il principale rallentamento è stato il doppio ciclo for
Perché non '('a_b', 'A_C', 'B_C')'? – Kasramvd
'key = lambda x: float (x)' è lo stesso - solo più lento - come 'key = float' –
Non so cosa si può ottenere la complessità complessiva di questi algoritmi verso il basso, dato che devi generare tutto quelle combinazioni. Puoi solo eseguire la micro-tuning (come nel non definire inutili lambda). Tuttavia: per cosa hai bisogno di queste combinazioni, in primo luogo? Forse c'è un modo migliore, ad es. solo generando le combinazioni, o senza l'ordinamento. –