2013-06-18 12 views
6

Mam system, w którym często (ale nie zawsze) muszę znaleźć następny element w krotce. Jestem obecnie robi to tak:Najbardziej skuteczny sposób na znalezienie następnego elementu w kodzie korygującym

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) 

Wszystkie elementy są unikatowe i nie jestem skazany na krotki, mogę zrobić coś innego wcześniej w programie, jeśli potrzebne.

Ponieważ muszę to zrobić dużo, zastanawiałem się, czy jest jakiś bardziej skuteczny sposób to zrobić?

+0

Wszystkie numery są unikatowe? –

+0

Jeśli utknąłeś ze strukturą danych (tzn. Krotką), to nie. Wyszukiwanie liniowe to wszystko, co możesz zrobić. –

+0

Tak, wszystkie elementy są unikalne, ale tak naprawdę to nie są liczby w moim programie, ale ciągi. Aby uprościć ten przykład, właśnie utworzyłem tutaj liczby .. – kramer65

Odpowiedz

7

Skorzystaj z dyktatury tutaj, dyktuje zapewnienie wyszukiwania O(1) w porównaniu do list.index, która jest operacją O(N).

A to będzie działać również na strunach.

>>> 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' 

Pamięć wydajny wersja stworzyć powyższy dict:

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

Jesteście, są genialni i wszechstronna wspaniała osoba. Dzięki! – kramer65

1

może chcesz zbudować indeksu użyciu słownika:

# 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 

Jeśli lista zmian w miarę upływu czasu , będziesz musiał odbudować indeks. Aby uzyskać rozwiązanie bardziej wydajne pod względem pamięci, możesz zamiast tego użyć "zip" zgodnie z sugestią innej odpowiedzi.

Powiązane problemy