Câu hỏi Làm thế nào để có được số lượng các phần tử trong một danh sách bằng Python?


items = []
items.append("apple")
items.append("orange")
items.append("banana")

# FAKE METHOD::
items.amount()  # Should return 3

Làm thế nào để tôi nhận được số phần tử trong danh sách?


1539
2017-11-11 00:30


gốc


Bạn rõ ràng đang yêu cầu số lượng phần tử trong danh sách. Nếu người tìm kiếm đến đây tìm kích thước của đối tượng trong bộ nhớ, đây là câu hỏi và câu trả lời thực tế mà họ đang tìm kiếm: Làm cách nào để xác định kích thước của một đối tượng bằng Python? - Aaron Hall♦


Các câu trả lời:


Các len() chức năng có thể được sử dụng với rất nhiều loại trong Python - cả hai loại được xây dựng trong và các loại thư viện.

>>> len([1,2,3])
3

2136
2017-11-11 00:33





Làm thế nào để có được kích thước của một danh sách?

Để tìm kích thước của danh sách, hãy sử dụng hàm dựng sẵn, len:

items = []
items.append("apple")
items.append("orange")
items.append("banana")

Và bây giờ:

len(items)

trả về 3.

Giải trình

Mọi thứ trong Python là một đối tượng, kể cả các danh sách. Tất cả các đối tượng có một tiêu đề của một số loại trong việc thực hiện C.

Các danh sách và các đối tượng nội trang dựng sẵn tương tự khác có một "kích thước" trong Python, đặc biệt, có một thuộc tính được gọi là ob_size, trong đó số lượng phần tử trong đối tượng được lưu trong bộ nhớ cache. Vì vậy, kiểm tra số lượng các đối tượng trong một danh sách là rất nhanh.

Nhưng nếu bạn đang kiểm tra nếu kích thước danh sách là không hoặc không, không sử dụng len - thay thế, đặt danh sách theo ngữ cảnh boolean - nó được coi là Sai nếu trống, Đúng nếu không.

Từ tài liệu

len(s)

Trả về độ dài (số lượng các mục) của một đối tượng. Đối số có thể là một chuỗi (chẳng hạn như chuỗi, byte, tuple, danh sách hoặc dải ô) hoặc   một bộ sưu tập (chẳng hạn như từ điển, tập hợp hoặc bộ được cố định).

len được triển khai với __len__, từ mô hình dữ liệu tài liệu:

object.__len__(self)

Được gọi để triển khai chức năng tích hợp len(). Nên trả về độ dài của đối tượng, một số nguyên> = 0. Ngoài ra, một đối tượng không   xác định __nonzero__() [bằng Python 2 hoặc __bool__() trong Python 3] phương pháp và có __len__() phương thức trả về số không   được coi là sai trong ngữ cảnh Boolean.

Và chúng ta cũng có thể thấy rằng __len__ là một phương pháp của danh sách:

items.__len__()

trả về 3.

Builtin loại bạn có thể nhận được len (độ dài của

Và trên thực tế, chúng tôi thấy rằng chúng tôi có thể nhận được thông tin này cho tất cả các loại được mô tả:

>>> all(hasattr(cls, '__len__') for cls in (str, bytes, tuple, list, 
                                            xrange, dict, set, frozenset))
True

Không được dùng len để kiểm tra danh sách trống hoặc không trống

Để kiểm tra một độ dài cụ thể, tất nhiên, chỉ cần kiểm tra tính bình đẳng:

if len(items) == required_length:
    ...

Nhưng có một trường hợp đặc biệt để thử nghiệm cho một danh sách độ dài bằng không hoặc nghịch đảo. Trong trường hợp đó, không kiểm tra tính bình đẳng.

Ngoài ra, không làm:

if len(items): 
    ...

Thay vào đó, chỉ cần làm:

if items:     # Then we have some items, not empty!
    ...

hoặc là

if not items: # Then we have an empty list!
    ...

tôi giải thích lý do tại sao nhưng trong ngắn hạn, if items hoặc là if not items vừa dễ đọc hơn vừa hiệu quả hơn.


138
2017-11-25 21:51





Mặc dù điều này có thể không hữu ích do thực tế là nó có ý nghĩa hơn nhiều khi là chức năng "ngoài hộp", một bản hack khá đơn giản sẽ là xây dựng một lớp học với length bất động sản:

class slist(list):
    @property
    def length(self):
        return len(self)

Bạn có thể sử dụng nó như vậy:

>>> l = slist(range(10))
>>> l.length
10
>>> print l
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

Về cơ bản, nó giống hệt với một đối tượng danh sách, với lợi ích bổ sung khi có OOP thân thiện length bất động sản.

Như mọi khi, phụ cấp của bạn có thể khác nhau.


64
2018-04-19 21:51



để bạn biết, bạn có thể làm length = property(len) và bỏ qua chức năng trình bao bọc một dòng và giữ nguyên tài liệu / nội suy của len với tài sản của bạn. - Tadhg McDonald-Jensen


ngoài ra len bạn cũng có thể dùng operator.length_hint (yêu cầu python 3.4+). Đối với bình thường list cả hai đều tương đương nhưng length_hint làm cho nó có thể có được chiều dài của một danh sách-iterator, mà có thể hữu ích trong một số trường hợp:

>>> from operator import length_hint
>>> l = ["apple", "orange", "banana"]
>>> len(l)
3
>>> length_hint(l)
3

>>> list_iterator = iter(l)
>>> len(list_iterator)
TypeError: object of type 'list_iterator' has no len()
>>> length_hint(list_iterator)
3

Nhưng length_hint theo định nghĩa chỉ là "gợi ý", vì vậy phần lớn thời gian len tốt hơn.

Tôi đã thấy một số câu trả lời gợi ý truy cập __len__. Điều này là ổn khi giao dịch với các lớp dựng sẵn như list nhưng nó có thể dẫn đến các vấn đề với các lớp tùy chỉnh vì len (và length_hint) thực hiện một số kiểm tra an toàn. Ví dụ: cả hai không cho phép độ dài hoặc độ dài phủ định vượt quá một giá trị nhất định ( sys.maxsize giá trị). Vì vậy, việc sử dụng len thay vì __len__ phương pháp!


9
2018-04-07 19:03





Trả lời câu hỏi của bạn như các ví dụ cũng được đưa ra trước đây:

items = []
items.append("apple")
items.append("orange")
items.append("banana")

print items.__len__()

6
2017-07-14 08:36



Trong Python, các tên bắt đầu bằng dấu gạch dưới là các phương thức không công khai về ngữ nghĩa và không nên được người dùng sử dụng. - Aaron Hall♦
1. __foo__: đây chỉ là một quy ước, một cách để hệ thống Python sử dụng tên sẽ không xung đột với tên người dùng. 2. _foo: đây chỉ là một quy ước, một cách để lập trình viên chỉ ra rằng biến là riêng tư (bất kể điều đó có nghĩa là trong Python). 3. __foo: điều này có ý nghĩa thực sự: người thông dịch thay thế tên này bằng _classname__foo như một cách để đảm bảo rằng tên sẽ không trùng lặp với một tên tương tự trong một lớp khác. * Không có hình thức gạch dưới nào khác có ý nghĩa trong thế giới Python. * Không có sự khác biệt giữa các lớp, biến, toàn cầu, vv trong các quy ước này. - Shai Alon
Giải Đáp này giải thích tại sao bạn không nên sử dụng các phương thức đặc biệt trực tiếp với tư cách người dùng: stackoverflow.com/q/40272161/541136 - Aaron Hall♦
@AaronHall nhưng đối với chức năng len nó gần như giống nhau. Nó có thể nhanh hơn cho các biến rất lớn. Tuy nhiên, tôi nhận được quan điểm của bạn và chúng ta nên sử dụng len (obj) và không obj .__ len __ (). - Shai Alon


Và để hoàn thành (lấy một cho đội với các downvotes), nó có thể mà không cần sử dụng len() chức năng (Tôi sẽ không tha thứ cho điều này như là một lựa chọn tốt):

def count(list):
  item_count = 0
  for item in list[:]:
    item_count = item_count + 1
  return item_count

count([1,2,3,4,5])

(dấu hai chấm trong list[:] là ngầm, do đó cũng tùy chọn)


-1
2017-12-06 18:14



OP ở đâu nói rằng anh ta không muốn sử dụng hàm len ()? - George J. Adams
@ GeorgeJ.Adams Nắp suy nghĩ sáng tạo của bạn ở đâu? Câu trả lời của tôi trả lời OP, mặc dù khác nhau. Chúng tôi đánh giá cao sự đa dạng của câu trả lời ở đây tại StackExchange, phải không? - Jonathan Komar
Đã đồng ý. Nhưng vấn đề là trong trường hợp này không có lý do gì để sử dụng mã của bạn v. Nó tính toán nhanh hơn? Chương trình này có dễ dàng hơn không? Nhiều câu trả lời được hoan nghênh nếu chúng hiển thị thứ nguyên mới. - George J. Adams
@ GeorgeJ.Adams Tôi đồng ý. Nhưng đó cũng không phải là lý do để bác bỏ câu trả lời này. Tôi đứng bởi lập luận đa dạng của tôi. - Jonathan Komar
@ Jonathan Komar tôi không đồng ý, nếu OP đang tìm kiếm những cách sáng tạo không hiệu quả để làm điều đó, anh ta sẽ chỉ định. Một số câu hỏi có thể được trả lời 1 triệu cách khác nhau, nhưng không ai muốn đọc qua 1 triệu câu trả lời khác nhau - Brandon Ling