2012-01-04 12 views
19

Czy to możliwe, aby uzyskać wartość z krotka:wartość Tuple przez kluczowego

TUPLE = (
    ('P', 'Shtg1'), 
    ('R', u'Shtg2'), 
    ('D', 'Shtg3'), 
) 

wywołując klawisza STR jak P

Python mówi, że tylko int mogą być wykorzystywane do tego typu „zapytania”

Nie mogę użyć pętli (zbyt duży nadmiar ...)

Dziękujemy!

+3

Nie ma innej możliwości niż zapętlenie sekwencyjne, dopóki nie znajdziesz klucza o takiej strukturze danych. Jeśli tego nie chcesz, potrzebujesz mapowania (w Pythonie używa tabeli mieszającej do wyszukiwania w stałych odstępach czasu). Możesz łatwo zmienić to w 'dyktowanie', mówiąc" dict (TUPLE) ". –

+0

["namedtuple'] (http://docs.python.org/library/collections.html#collections.namedtuple) mogą być używane do tego. Zobacz odpowiedź Eduardo i moje opracowanie. – cod3monk3y

Odpowiedz

35

Kanoniczna struktura danych dla tego typu zapytań jest słownikiem:

In [1]: t = (
    ...:  ('P', 'Shtg1'), 
    ...:  ('R', u'Shtg2'), 
    ...:  ('D', 'Shtg3'), 
    ...:) 

In [2]: d = dict(t) 

In [3]: d['P'] 
Out[3]: 'Shtg1' 

Jeśli używasz krotki, nie ma sposobu, aby uniknąć pętli (wyraźna lub dorozumiana).

+0

Nie ważne, dzień ... – Mission

7

Zamiast tego chcesz użyć słownika.

d = { 'P': 'Shtg1', 'R': u'Shtg2', 'D':'Shtg3' } 

a następnie można uzyskać dostęp do klucza tak:

d['P'] # Gets 'Shtg1' 
6

Zamiast przeprowadzce do pełnych słowników można spróbować użyć named tuple zamiast. Więcej informacji pod numerem this question.

Zasadniczo można zdefiniować znaczniki na polach, a następnie są w stanie odnieść się do nich jako value.tag1 itp

Cytowanie docs:

nazwanych wystąpień krotkowe nie posiadają słowniki per-instancji , więc one są lekkie i nie wymagają więcej pamięci niż zwykłe krotki.

3

Aby rozwinąć odpowiedź Eduardo za pomocą kodu z powłoki Pythona.

>>> from collections import namedtuple 
>>> MyType = namedtuple('MyType', ['P', 'R', 'D']) 
>>> TUPLE = MyType(P='Shtg1', R=u'Shtg2', D='Shtg3') 
>>> TUPLE 
MyType(P='Shtg1', R=u'Shtg2', D='Shtg3') 

>>> TUPLE.P 
'Shtg1' 

>>> TUPLE.R 
u'Shtg2' 

>>> TUPLE.D 
'Shtg3' 

>>> TUPLE[0:] 
('Shtg1', u'Shtg2', 'Shtg3') 

Pamiętaj, że krotki są niezmienne, a słowniki są zmienne. Jeśli chcesz mieć niezmienne typy, może to być jedna z wielu dróg.

4

dict(TUPLE)[key] zrobi to, co chcesz.

Jest niewiele pamięci narzutowej, ale jest szybki.

+0

Czy możesz wymyślić sposób na to, używając wielu kluczy? Na przykład. jeśli oryginalny kod był 'foo, bar = TUPLE', czy istnieje idiomatyczny sposób rozpakowania' namedtuple' na wiele zmiennych w oparciu o klucze? Jest to oczywiście niepoprawne, ale coś w stylu 'foo, bar = dict (TUPLE) [" foo "," bar "]' – meowsqueak