2012-01-04 32 views
19

Có thể để có được giá trị gia tăng ra khỏi tuple:giá trị tuple bằng phím

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

bằng cách gọi chính STR như P

Python nói rằng chỉ có int có thể được sử dụng cho loại 'truy vấn'

Tôi không thể sử dụng vòng lặp (quá nhiều chi phí ...)

Cảm ơn bạn!

+3

Không có cách nào khác hơn là lặp tuần tự cho đến khi bạn tìm thấy khóa có cấu trúc dữ liệu như thế này. Nếu bạn không muốn điều đó, thì bạn cần một ánh xạ (trong Python nó sử dụng một bảng băm để tra cứu hằng thời gian). Bạn có thể dễ dàng biến điều này thành 'dict' bằng cách nói' dict (TUPLE) '. –

+0

['namedtuple'] (http://docs.python.org/library/collections.html#collections.namedtuple) có thể được sử dụng cho việc này. Xem câu trả lời của Eduardo và sự xây dựng của tôi. – cod3monk3y

Trả lời

35

Cấu trúc dữ liệu kinh điển cho loại truy vấn là một từ điển:

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

In [2]: d = dict(t) 

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

Nếu bạn sử dụng một tuple, không có cách nào để tránh lặp (hoặc rõ ràng hoặc ngầm).

+0

Không bao giờ bận tâm trong ngày dài ... – Mission

7

Bạn muốn sử dụng từ điển để thay thế.

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

Và sau đó bạn có thể truy cập vào quan trọng như vậy:

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

Thay vì di chuyển tới các từ điển đầy đủ, bạn có thể thử sử dụng một named tuple để thay thế. Thêm thông tin trong this question.

Về cơ bản bạn định nghĩa các thẻ cho các lĩnh vực và sau đó có thể gọi chúng là value.tag1 vv

Trích dẫn các tài liệu:

trường tuple tên không có từ điển cho mỗi sơ thẩm , do đó, chúng nhẹ và không cần nhiều bộ nhớ hơn so với bộ thông thường.

3

Để xây dựng câu trả lời của Eduardo với một số mã từ trình bao python.

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

Hãy nhớ rằng bộ dữ liệu không thay đổi và từ điển có thể thay đổi. Nếu bạn muốn loại bất biến, namedtuple có thể là cách để đi.

4

dict(TUPLE)[key] sẽ làm những gì bạn muốn.

Có một ít dung lượng bộ nhớ, nhưng rất nhanh.

+0

Bạn có thể nghĩ ra cách để thực hiện điều này bằng nhiều phím không? Ví dụ. nếu mã ban đầu là 'foo, bar = TUPLE', có một cách thành ngữ để giải nén một' namedtuple' thành nhiều biến dựa trên các khóa không? Điều này rõ ràng là không chính xác nhưng một cái gì đó như 'foo, bar = dict (TUPLE) [" foo "," bar "]' – meowsqueak

Các vấn đề liên quan