2011-10-24 23 views
27

Tôi có danh sách các bộ dữ liệu. Mỗi tuple có 5 yếu tố (tương ứng với 5 cột cơ sở dữ liệu) và tôi muốn thực hiện một truy vấnChọn giá trị từ danh sách bộ dữ liệu nơi điều kiện

select attribute1 from mylist where attribute2 = something

ví dụ

personAge = select age from mylist where person_id = 10

Có thể truy vấn danh sách các bản ghi trong một cách nào đó?

cảm ơn bạn

Trả lời

42

Nếu bạn có named tuples bạn có thể làm điều này:

results = [t.age for t in mylist if t.person_id == 10] 

Nếu không sử dụng các chỉ số:

results = [t[1] for t in mylist if t[0] == 10] 

Hoặc sử dụng tuple giải nén như mỗi câu trả lời của Nate. Lưu ý rằng bạn không phải đặt tên có ý nghĩa cho mỗi mục bạn giải nén. Bạn có thể làm (person_id, age, _, _, _, _) để giải nén một tuple sáu mục.

11

Một giải pháp này sẽ là một danh sách hiểu biết, với mô hình phù hợp với bên trong tuple của bạn:

>>> mylist = [(25,7),(26,9),(55,10)] 
>>> [age for (age,person_id) in mylist if person_id == 10] 
[55] 

Một cách khác sẽ được sử dụng mapfilter:

>>> map(lambda (age,_): age, filter(lambda (_,person_id): person_id == 10, mylist)) 
[55] 
6

Vâng, bạn có thể sử dụng bộ lọc nếu bạn biết vị trí nào trong tuple, cột mong muốn sẽ nằm. Nếu trường hợp là id là phần tử đầu tiên của bộ dữ liệu thì bạn có thể lọc danh sách như vậy:

filter(lambda t: t[0]==10, mylist) 

Điều này sẽ trả về danh sách các bộ tương ứng. Nếu bạn muốn tuổi tác, chỉ cần chọn phần tử bạn muốn. Thay vì lọc bạn cũng có thể sử dụng danh sách hiểu và chọn phần tử trong lần đầu tiên. Bạn thậm chí có thể giải nén nó ngay lập tức (nếu chỉ có một kết quả):

[age] = [t[1] for t in mylist if t[0]==10] 

Nhưng tôi rất muốn giới thiệu để sử dụng dictionaries hoặc named tuples cho mục đích này.

+0

Nhưng nếu OP muốn sử dụng một vòng loại khác thì sao? Ví dụ: một dải ô thay vì giá trị? Điều này sẽ ngăn cản việc sử dụng các từ điển. – Nate

+0

@Nate Khi tôi undrestood nó ông có một danh sách các tuples đồng nhất, ví dụ: '[(1, 'name', 20, 'bar'), (2, 'name2', 33, 'foo'), ... ] 'và nếu tôi muốn làm việc với điều này, tôi sẽ ánh xạ từng tuple vào từ điển, ví dụ:' [{'id': 1, 'name': 'name', 'age': 20, 'etc': 'bar '}, ..] '. Truy vấn nó sẽ trở nên dễ đọc hơn nhiều. Nếu tôi chỉ truy vấn bằng id tôi thậm chí có thể sử dụng nó như là một khóa từ điển (vì vậy nó sẽ là một từ điển của từ điển). – rplnt

+0

Tôi đoán tôi có nghĩa là nếu anh ta muốn 'chọn nơi person_id> 5 và person_id <15' hoặc một cái gì đó như thế, từ điển không được trang bị để thực hiện loại tìm kiếm này; Ngoài ra, nếu anh ta muốn chọn theo độ tuổi thay thế thì sao? Bạn sẽ phải thực hiện một số loại hiểu từ điển trong cả hai trường hợp đó. – Nate

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