2013-06-18 25 views
6

Ho un sistema in cui spesso (ma non costantemente) devo trovare l'elemento successivo in una tupla. Attualmente sto facendo questo in questo modo:Il modo più efficace per trovare l'elemento successivo in una tupla

mytuple = (2,6,4,8,7,9,14,3) 
currentelement = 4 
def f(mytuple, currentelement): 
    return mytuple[mytuple.index(currentelement) + 1] 
nextelement = f(mytuple, currentelement) 

Tutti gli elementi sono unici e non mi sono bloccato con la tupla, posso fare qualcos'altro in precedenza nel programma, se necessario.

Dal momento che ho bisogno di fare questo molto, mi chiedevo se c'è un modo più efficiente per fare questo?

+0

Tutti i numeri sono unici? –

+0

Se si è bloccati con la struttura dati (ad esempio una tupla), quindi no. Una ricerca lineare è tutto ciò che puoi fare. –

+0

Sì, tutti gli elementi sono unici, ma in realtà non sono numeri nel mio programma, ma stringhe. Per semplificare l'esempio, ho appena creato dei numeri qui .. – kramer65

risposta

7

Utilizzare un comando qui, diciamo fornire O(1) ricerca rispetto a list.index che è un'operazione O(N).

E questo funzionerà anche per le stringhe.

>>> lis = (2,6,4,8,7,9,14,3) 
>>> dic = dict(zip(lis, lis[1:])) 
>>> dic[4] 
8 
>>> dic[7] 
9 
>>> dic.get(100, 'not found') #dict.get can handle key errors 
'not found' 

Un ricordo versione efficiente per creare la dict sopra:

>>> from itertools import izip 
>>> lis = (2,6,4,8,7,9,14,3) 
>>> it1 = iter(lis) 
>>> it2 = iter(lis) 
>>> next(it2) 
2 
>>> dict(izip(it1,it2)) 
{2: 6, 4: 8, 6: 4, 7: 9, 8: 7, 9: 14, 14: 3} 
+0

Lei signore, sono geniale e una persona eccezionale a 360 gradi. Grazie! – kramer65

1

si potrebbe desiderare di costruire un indice utilizzando un dizionario:

# The list 
>>> lis = (2,6,4,8,7,9,14,3) 

# build the index 
>>> index = dict(zip(lis, range(len(lis)))) 
>>> index 
{2: 0, 3: 7, 4: 2, 6: 1, 7: 4, 8: 3, 9: 5, 14: 6} 

# Retrieve position by using the index 
>>> index[6] 
1 
>>> lis[index[6]+1] 
4 

Se la lista la modifica nel corso del tempo , dovrai ricostruire l'indice. Per una soluzione più efficiente in termini di memoria, è preferibile utilizzare izip invece di `zip come suggerito in un'altra risposta.