Vraag Hoe het aantal elementen in een lijst in Python te krijgen?


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

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

Hoe krijg ik het aantal elementen in de lijst?


1530
2017-11-11 00:30


oorsprong


antwoorden:


De len() functie kan met veel typen worden gebruikt Python - zowel ingebouwde typen als bibliotheektypen.

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

2125
2017-11-11 00:33



Hoe de grootte van een lijst te krijgen?

Gebruik de ingebouwde functie om de grootte van een lijst te vinden len:

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

En nu:

len(items)

levert 3 op.

Uitleg

Alles in Python is een object, inclusief lijsten. Alle objecten hebben een header van een soort in de C-implementatie.

Lijsten en andere soortgelijke ingebouwde objecten met een "grootte" in Python, in het bijzonder, hebben een attribuut genaamd ob_size, waarbij het aantal elementen in het object in de cache wordt opgeslagen. Het controleren van het aantal objecten in een lijst is dus erg snel.

Maar als u controleert of de lijstgrootte nul is of niet, gebruik dan niet len - in plaats daarvan, zet de lijst in een Booleaanse context - het wordt behandeld als False als leeg, True anders.

Van de docs

len(s)

Retourneer de lengte (het aantal items) van een object. Het argument kan een reeks zijn (zoals een tekenreeks, bytes, tuple, lijst of bereik) of   een verzameling (zoals een woordenboek, set of bevroren set).

len is geïmplementeerd met __len__, van het datamodel docs:

object.__len__(self)

Bellen om de ingebouwde functie te implementeren len(). Moet de lengte van het object retourneren, een geheel getal> = 0. Ook een object dat dat niet doet   definieer a __nonzero__() [in Python 2 of __bool__() in Python 3] methode en waarvan __len__() methode geeft nul terug   wordt als fout beschouwd in een Booleaanse context.

En dat kunnen we ook zien __len__ is een methode van lijsten:

items.__len__()

levert 3 op.

Ingebouwde typen kunt u de len (lengte van

En in feite zien we dat we deze informatie kunnen krijgen voor alle beschreven typen:

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

Gebruik niet len om te testen op een lege of niet-lege lijst

Om te testen op een specifieke lengte, test je natuurlijk gewoon op gelijkheid:

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

Maar er is een speciaal geval voor het testen van een nul-lengte lijst of de inverse. Test in dat geval niet op gelijkheid.

Doe ook niet:

if len(items): 
    ...

Doe in plaats daarvan gewoon:

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

of

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

ik leg hier uit waarom maar kortom, if items of if not items is zowel leesbaarder als performanter.


136
2017-11-25 21:51



Hoewel dit misschien niet handig is vanwege het feit dat het een stuk logischer zou zijn als zijnde "out-of-the-box" -functionaliteit, zou het een vrij eenvoudige hack zijn om een ​​klas te bouwen met een length eigendom:

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

Je kunt het als volgt gebruiken:

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

In wezen is het precies hetzelfde als een lijstobject, met als bijkomend voordeel dat het een OOP-vriendelijk heeft length eigendom.

Zoals altijd kan uw kilometerstand variëren.


64
2018-04-19 21:51



behalve len je kan ook gebruiken operator.length_hint (vereist python 3.4+). Voor normaal list beide zijn gelijkwaardig maar length_hint maakt het mogelijk om de lengte van een list-iterator te krijgen, wat in bepaalde omstandigheden nuttig zou kunnen zijn:

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

Maar length_hint is per definitie slechts een "hint", dus meestal len is beter.

Ik heb verschillende antwoorden gezien die op toegang duiden __len__. Dit is goed als je te maken hebt met ingebouwde klassen zoals list maar het zou kunnen leiden tot problemen met aangepaste klassen omdat len (en length_hint) implementeer enkele veiligheidscontroles. Beide staan ​​bijvoorbeeld geen negatieve lengtes of lengtes toe die een bepaalde waarde overschrijden (de sys.maxsize waarde). Het is dus altijd veiliger om de len function in plaats van de __len__ methode!


9
2018-04-07 19:03



Beantwoord uw vraag als de eerder gegeven voorbeelden:

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

print items.__len__()

6
2017-07-14 08:36



En voor de volledigheid (een nemen voor het team met de downvotes), is het mogelijk zonder de len() functie (ik zou dit niet goedkeuren als een goede optie):

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

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

(de dubbele punt in list[:] is impliciet, daarom ook optioneel)


-1
2017-12-06 18:14