Soru Python'da bir listedeki elemanların sayısı nasıl alınır?


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

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

Listedeki eleman sayısını nasıl alabilirim?


1539
2017-11-11 00:30


Menşei


Açıkçası listede bulunan elemanların sayısını soruyorsunuz. Eğer bir arayıcı buraya, nesnenin belleğindeki boyutunu aramak için gelirse, bu, aradıkları gerçek soru ve cevaplardır: Python'da bir nesnenin boyutunu nasıl belirleyebilirim? - Aaron Hall♦


Cevaplar:


len() fonksiyonu çok çeşitli türlerde kullanılabilir piton - her iki gömme tip ve kütüphane türleri.

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

2136
2017-11-11 00:33





Bir listenin büyüklüğünü nasıl alabilirim?

Bir listenin boyutunu bulmak için yerleşik işlevi kullanın. len:

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

Ve şimdi:

len(items)

3 döndürür.

açıklama

Python'daki her şey, listeler dahil bir nesnedir. Tüm nesnelerin C uygulamasında bir çeşit başlık vardır.

Listeler ve Python'da bir "büyüklük" ile diğer benzer yerleşik nesneler, özellikle, bir öznitelik var ob_sizeNesnede sayıların önbelleğe alındığı yer. Yani listedeki nesnelerin sayısını kontrol etmek çok hızlıdır.

Ancak, liste boyutunun sıfır olup olmadığını kontrol ediyorsanız kullanmayın len - yerine, Listeyi bir boolean bağlamında yerleştirin - boşsa False olarak kabul edildi, aksi halde True.

İtibaren docs

len(s)

Bir nesnenin uzunluğunu (öğe sayısını) döndür. Argüman bir dizi (string, bayt, tuple, liste veya aralık gibi) veya   Bir koleksiyon (sözlük, küme veya donmuş küme gibi).

len ile uygulanmaktadır __len__veri modelinden docs:

object.__len__(self)

Yerleşik fonksiyonu uygulamak için denir len(). Nesnenin uzunluğunu döndürmesi gereken bir tam sayı> = 0. Ayrıca, olmayan bir nesne   tanımla __nonzero__() [Python 2'de veya __bool__() Python 3] metodunda ve __len__() yöntem sıfır döndürür   Boolean bağlamında false olarak kabul edilir.

Ve bunu da görebiliriz __len__ bir liste yöntemidir:

items.__len__()

3 döndürür.

Yerleşik türleri alabilirsiniz len (uzunluğu

Ve aslında, bu bilgileri açıklanan tüm tipler için alabileceğimizi görüyoruz:

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

Kullanmayın len boş veya muaf olmayan bir liste için test etmek

Belli bir süreyi test etmek için, tabi ki, sadece eşitliği test edin:

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

Ancak sıfır uzunluk listesi veya ters için test etmek için özel bir durum var. Bu durumda eşitlik için test yapmayın.

Ayrıca, yapmayın:

if len(items): 
    ...

Bunun yerine, sadece yapın:

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

veya

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

ben neden burada açıkla ama kısaca if items veya if not items hem daha okunaklı hem de daha performanslıdır.


138
2017-11-25 21:51





Bu, "kutunun dışında" işlevinin çok daha anlamlı hale gelmesi nedeniyle faydalı olmayabilir, ancak oldukça basit bir hack, length özelliği:

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

Bunu şöyle kullanabilirsiniz:

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

Aslında, bir OOP dostu sahip olmanın ek yararı ile, bir liste nesnesine tam olarak aynıdır. length özelliği.

Her zaman olduğu gibi, kilometreniz değişebilir.


64
2018-04-19 21:51



sadece bilirsin, yapabilirsin length = property(len) ve bir satır sarıcı işlevini atlayın ve belgelerin / içeriğin len mülkünle. - Tadhg McDonald-Jensen


dışında len Ayrıca kullanabilirsiniz operator.length_hint (python 3.4+ gerektirir). Normal için list her ikisi de eşdeğer ama length_hint belirli durumlarda yararlı olabilecek bir liste yineleyici uzunluğunun elde edilmesini mümkün kılar:

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

Fakat length_hint tanım gereği sadece bir "ipucu", bu yüzden çoğu zaman len daha iyi.

Erişimi öneren birkaç cevap gördüm __len__. Bu gibi yerleşik sınıflarla uğraşırken list ancak özel sınıflarla ilgili sorunlara yol açabilir çünkü len (ve length_hint) bazı güvenlik kontrolleri uygulayın. Örneğin, her ikisi de belirli bir değeri aşan negatif uzunluklara veya uzunluklara izin vermez ( sys.maxsize değeri). Yani kullanmak her zaman daha güvenli len yerine işlev __len__ yöntem!


9
2018-04-07 19:03





Sorunuzu daha önce verilen örnekler olarak yanıtlayın:

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

print items.__len__()

6
2017-07-14 08:36



Python'da, altçizgi ile başlayan isimler semantik olarak kamusal olmayan yöntemlerdir ve kullanıcılar tarafından kullanılmamalıdır. - Aaron Hall♦
1. __foo__: Bu sadece bir sözleşmedir, Python sisteminin kullanıcı isimleriyle çakışmayan isimleri kullanması için bir yoldur. 2. _foo: Bu sadece bir kuraldır, programcının değişkenin özel olduğunu belirtmesi için bir yoldur (Python'da ne anlama gelirse). 3. __foo: Bu gerçek bir anlamı vardır: yorumlayıcı bu ismi ile değiştirir _classname__foo adın, başka bir sınıfta benzer bir adla çakışmayacağının bir yolu olarak. * Python dünyasında başka hiçbir alt simge anlamı yoktur. * Bu sözleşmelerde sınıf, değişken, küresel vb. - Shai Alon
Bu Soru-Cevap, özel yöntemleri doğrudan kullanıcı olarak neden kullanmamanızı açıklar: stackoverflow.com/q/40272161/541136 - Aaron Hall♦
@AaronHall ama len fonksiyonu için neredeyse aynı. Çok büyük değişkenler için daha hızlı olabilir. Bununla birlikte, ben sizin puanınızı alırım ve len (obj) ile obj .__ len __ () 'yi kullanmamalıyız. - Shai Alon


Ve bütünlük için (downvotes ile takım için bir tane alarak), kullanmadan mümkündür len() işlevi (bunu iyi bir seçenek olarak kabul etmem):

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

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

(içinde kolon list[:] örtük, bu nedenle de isteğe bağlı)


-1
2017-12-06 18:14



OP, len () işlevini kullanmak istemediğini söyledi? - George J. Adams
@ GeorgeJ.Adams Yaratıcı düşünme kapağınız nerede? Cevabım OP'ye farklı cevaplar verse de cevap veriyor. StackExchange'de çok sayıda cevaba değer veriyoruz, değil mi? - Jonathan Komar
Kabul. Fakat buradaki şey, kodunuzu kullanmak için bir neden yoktur. Bu hesaplama daha hızlı mı? Bu şekilde programlamak daha mı kolay? Yeni bir boyut gösterirlerse birden çok cevap kabul edilir. - George J. Adams
@ GeorgeJ.Adams Katılıyorum. Ama bu aynı zamanda bu cevabı reddetmek için bir sebep değil. Çeşitlilik tartışmamın yanındayım. - Jonathan Komar
@Jonathan Komar, katılmıyorum, eğer OP yaratıcı olmayan verimli yollar aramışsa, o bunu belirtecekti. Bazı sorular 1 milyon farklı yoldan cevaplanabilir, ancak hiç kimse 1 milyon farklı cevaptan okumak istemiyor. - Brandon Ling