2015-10-16 20 views
31

Khi một danh sách Python được biết là lúc nào cũng chứa một mục duy nhất, là có cách để truy cập vào nó khác hơn là: '? Tại sao bạn sẽ muốn'Chỉ lấy phần tử từ danh sách một phần tử trong Python?

mylist[0] 

Bạn có thể hỏi,. Chỉ tò mò thôi. Dường như có một cách khác để làm mọi thứ bằng Python.

+5

Có thể có các lựa chọn thay thế, nhưng thường chỉ có một cách * rõ ràng * để thực hiện - và trong trường hợp này, dường như bạn đã tìm thấy nó. – ekhumoro

+0

nếu nó * luôn luôn * chứa một mục duy nhất, thì có lẽ một 'danh sách' không phải là kiểu dữ liệu tốt nhất? –

+3

@ekhumoro: Tôi thực sự là một phần của phương pháp giải nén trình tự, bởi vì nó xác minh giả định rằng trình tự chỉ có một phần tử. 'mylist [0]' thành công khi bạn có ít nhất một phần tử, nhưng không phàn nàn nếu bạn thực sự có 30 phần tử. 'singleitem, = mylist' xác minh rằng bạn đã có chính xác một phần tử, không nhiều hơn, không kém. – ShadowRanger

Trả lời

48

Trình tự giải nén:

singleitem, = mylist 
# Identical in behavior (byte code produced is the same), 
# but arguably more readable since a lone trailing comma could be missed: 
[singleitem] = mylist 

sử dụng Explicit của giao thức iterator:

singleitem = next(iter(mylist)) 

phá hủy pop:

singleitem = mylist.pop() 

Negative index:

singleitem = mylist[-1] 
.210

Đặt qua lặp đơn for (vì biến vòng lặp vẫn sẵn với giá trị cuối cùng của nó khi một vòng lặp kết thúc):

for singleitem in mylist: break 

Nhiều người khác (kết hợp hoặc thay đổi bit ở trên, hoặc nếu không dựa vào lặp ngầm) , nhưng bạn hiểu ý rồi đấy.

+3

Không xứng đáng đưa vào câu trả lời chính do điên cuồng lan tràn: Tham số giải nén cho hàm đối số đơn (được thực hiện dưới dạng lambda ẩn danh trả về giá trị cho số tối đa): 'singleitem = (lambda x: x) (* mylist)' – ShadowRanger

+2

một là duy nhất ở chỗ nó cũng tăng nếu danh sách chứa nhiều hơn một phần tử. –

+6

Đầu tiên cũng có thể được viết là '[singleitem] = mylist'. –

4

Tôi sẽ thêm rằng thư viện more_itertools có công cụ trả về một mục từ một lần lặp lại.

from more_itertools import one 


iterable = ["foo"] 
one(iterable) 
# "foo" 

Ngoài ra, more_itertools.one sẽ phát sinh lỗi nếu có thể lặp lại hoặc có nhiều mục.

iterable = [] 
one(iterable) 
# ValueError: not enough values to unpack (expected 1, got 0) 

iterable = ["foo", "bar"] 
one(iterable) 
# ValueError: too many values to unpack (expected 1) 
Các vấn đề liên quan