2011-12-16 38 views
6

tôi có một danh sách theo hình thứcTrả về phút/tối đa của đa chiều trong Python?

[ [[a,b,c],[d,e,f]] , [[a,b,c],[d,e,f]] , [[a,b,c],[d,e,f]] ... ] etc. 

Tôi muốn trả về giá trị c tối thiểu và c + Giá trị f tối đa. Điều này có thể không?

+11

Vâng, mọi thứ đều có thể. Bạn đã thử cái gì? – JBernardo

+0

Hmmm. Bài tập về nhà? –

+0

Đã thử min (danh sách [0] [2]) vv để cố gắng lấy chỉ số thứ hai tối đa từ cụm thứ 0 của mỗi phần tử. Không có đầu mối làm thế nào để làm thứ hai. –

Trả lời

15

Đối với tối thiểu c:

min(c for (a,b,c),(d,e,f) in your_list) 

Đối với tối đa c+f

max(c+f for (a,b,c),(d,e,f) in your_list) 

Ví dụ:

>>> your_list = [[[1,2,3],[4,5,6]], [[0,1,2],[3,4,5]], [[2,3,4],[5,6,7]]] 
>>> min(c for (a,b,c),(d,e,f) in lst) 
2 
>>> max(c+f for (a,b,c),(d,e,f) in lst) 
11 
+0

Điều này dường như làm việc tuyệt vời; cảm ơn bạn! Không biết bạn có thể làm điều đó theo cách này (A cho B trong định dạng C) –

+0

Tôi thích nó. Tôi không chắc rằng việc hiểu danh sách là cách tốt nhất để * giải thích * nó ngay từ đầu, nhưng đó là một đoạn mã đáng yêu. –

+1

Ồ, nhân tiện, John, đó là thuật ngữ kỳ diệu mà bạn muốn cho loại mã này: "List comprehension". –

1

Bạn phải ánh xạ danh sách của mình đến danh sách chỉ chứa các mục bạn quan tâm.

Dưới đây là một cách tốt để làm điều này:

x = [[[5, 5, 3], [6, 9, 7]], [[6, 2, 4], [0, 7, 5]], [[2, 5, 6], [6, 6, 9]], [[7, 3, 5], [6, 3, 2]], [[3, 10, 1], [6, 8, 2]], [[1, 2, 2], [0, 9, 7]], [[9, 5, 2], [7, 9, 9]], [[4, 0, 0], [1, 10, 6]], [[1, 5, 6], [1, 7, 3]], [[6, 1, 4], [1, 2, 0]]] 

minc = min(l[0][2] for l in x) 
maxcf = max(l[0][2]+l[1][2] for l in x) 

Nội dung của minmax cuộc gọi là gì được gọi là một "generator", và chịu trách nhiệm tạo ra một ánh xạ các dữ liệu ban đầu để các dữ liệu đã lọc .

4

List comprehension để giải cứu

a=[[[1,2,3],[4,5,6]], [[2,3,4],[4,5,6]]] 
>>> min([x[0][2] for x in a]) 
3 

>>> max([x[0][2]+ x[1][2] for x in a]) 
10 
1

Tất nhiên điều đó là có thể. Bạn đã có một danh sách chứa danh sách các danh sách gồm hai phần tử hóa ra là các danh sách. Thuật toán cơ bản của bạn là

for each of the pairs 
    if c is less than minimum c so far 
     make minimum c so far be c 
    if (c+f) is greater than max c+f so far 
     make max c+f so far be (c+f) 
1

giả danh sách của bạn được lưu trữ trong my_list:

min_c = min(e[0][2] for e in my_list) 
max_c_plus_f = max(map(lambda e : e[0][2] + e[1][2], my_list))