Wie man eine Reihe von Zahlen aufzählt, die bei 1 beginnen

Lesezeit: 4 Minuten

Benutzer-Avatar
JeffTaggary

Ich verwende Python 2.5, ich möchte eine Aufzählung wie folgt (beginnend bei 1 statt 0):

[(1, 2000), (2, 2001), (3, 2002), (4, 2003), (5, 2004)]

Ich weiß, dass Sie in Python 2.6 Folgendes tun können: h = enumerate (range (2000, 2005), 1), um das obige Ergebnis zu erhalten, aber in Python 2.5 können Sie nicht …

Verwenden von Python 2.5:

>>> h = enumerate(range(2000, 2005))
>>> [x for x in h]
[(0, 2000), (1, 2001), (2, 2002), (3, 2003), (4, 2004)]

Kennt jemand eine Möglichkeit, das gewünschte Ergebnis in Python 2.5 zu erzielen?

  • Nur neugierig, da ich jemand bin, der beruflich nicht viel mit Python gemacht hat. Sind Sie auf Python 2.5 beschränkt, weil Ihr Unternehmen das Upgrade aus Kompatibilitätsgründen nicht durchführen möchte?

    – Sean

    21. Juli 2010 um 21:52 Uhr

  • Alle 2.x-Versionen sind abwärtskompatibel, das ist also kein Grund.

    – Jochen Ritzel

    21. Juli 2010 um 22:06 Uhr

  • Erzählen Sie das einigen Modulen – es gibt ein paar da draußen, die in Py 2.5 funktionieren, aber nicht in Py 2.6

    – xorsyst

    6. Februar 2013 um 16:15 Uhr

Benutzer-Avatar
Markus Byers

Wie Sie bereits erwähnt haben, ist dies in Python 2.6 oder neuer einfach:

enumerate(range(2000, 2005), 1)

Python 2.5 und älter unterstützen die nicht start Parameter, sodass Sie stattdessen zwei Range-Objekte erstellen und sie komprimieren könnten:

r = xrange(2000, 2005)
r2 = xrange(1, len(r) + 1)
h = zip(r2, r)
print h

Ergebnis:

[(1, 2000), (2, 2001), (3, 2002), (4, 2003), (5, 2004)]

Wenn Sie anstelle einer Liste einen Generator erstellen möchten, können Sie verwenden zip stattdessen.

  • verwenden izip und xrange wäre näher aufzuzählen

    – John LaRooy

    21. Juli 2010 um 21:52 Uhr

  • Diese Antwort ist längst überholt, man kann sie jetzt einfach stellen enumerate(iterable, start=1) ab Python 2.6.

    – Friedrich Brennan

    24. Februar 2013 um 22:50 Uhr

  • @frb: Hast du die Frage gelesen? Die Lösung für Python 2.6 kennt er bereits. Er bat ausdrücklich um eine Lösung, die in Python 2.5 funktioniert.

    – Mark Byers

    25. Februar 2013 um 9:05 Uhr

  • @MarkByers Anscheinend bin ich blind 🙂 Das tut mir wirklich leid. (Dies ist die Nummer 1 bei Google für „aufzählen beginnend bei 1“)

    – Friedrich Brennan

    25. Februar 2013 um 16:43 Uhr


  • @8chan ja, ich bin gerade von der Google-Suche hierher gekommen: “Aufzählung beginnt bei Null Python” 🙂

    – Baxx

    3. Juni 2015 um 0:06 Uhr

Nur um dies hier für die Nachwelt zu erwähnen, in 2.6 wurde der Parameter “start” hinzugefügt, um folgendermaßen aufzuzählen:

enumerate(sequence, start=1)

  • Beachten Sie, dass dadurch das erste Element in der Liste nicht übersprungen wird, sondern der Index um den Startwert versetzt wird, sodass Sie ein Array außerhalb der Grenzen erhalten würden, wenn Sie Folgendes tun würden: sequence[i] in deinem Code.

    – phyatt

    5. Dezember 2017 um 21:14 Uhr

Benutzer-Avatar
winklerrr

Python 3

Offizielle Python-Dokumentation: enumerate(iterable, start=0)

Sie müssen nicht selbst schreiben Generator wie andere Antworten hier vermuten lassen. Das eingebaute Python-Standardbibliothek enthält bereits eine Funktion, die genau das tut, was Sie wollen:

>>> seasons = ['Spring', 'Summer', 'Fall', 'Winter']
>>> list(enumerate(seasons))
[(0, 'Spring'), (1, 'Summer'), (2, 'Fall'), (3, 'Winter')]
>>> list(enumerate(seasons, start=1))
[(1, 'Spring'), (2, 'Summer'), (3, 'Fall'), (4, 'Winter')]

Die eingebaute Funktion ist äquivalent dazu:

def enumerate(sequence, start=0):
  n = start
  for elem in sequence:
    yield n, elem
    n += 1

Einfach, definieren Sie einfach Ihre eigene Funktion, die das tut, was Sie wollen:

def enum(seq, start=0):
    for i, x in enumerate(seq):
        yield i+start, x

Der einfachste Weg, in Python 2.5 genau das zu tun, wonach Sie fragen:

import itertools as it

... it.izip(it.count(1), xrange(2000, 2005)) ...

Wenn Sie eine Liste wünschen, wie Sie scheinen, verwenden Sie zip anstelle it.izip.

(Übrigens, im Allgemeinen ist der beste Weg, eine Liste aus einem Generator oder einem anderen iterierbaren X zu erstellen, nicht [x for x in X]sondern eher list(X)).

Benutzer-Avatar
Jochen Ritzel

from itertools import count, izip

def enumerate(L, n=0):
    return izip( count(n), L)

# if 2.5 has no count
def count(n=0):
    while True:
        yield n
        n+=1

Jetzt h = list(enumerate(xrange(2000, 2005), 1)) funktioniert.

enumerate ist trivial, ebenso wie die Neuimplementierung, um einen Start zu akzeptieren:

def enumerate(iterable, start = 0):
    n = start
    for i in iterable:
        yield n, i
        n += 1

Beachten Sie, dass dies keinen Code unterbricht, der enumerate ohne Startargument verwendet. Alternativ kann dieser Oneliner eleganter und möglicherweise schneller sein, bricht aber andere Verwendungen von enumerate:

enumerate = ((index+1, item) for index, item)

Letzteres war purer Unsinn. @Duncan hat den Wrapper richtig verstanden.

  • Ja, totaler Blödsinn. Etwas in dieser Richtung würde z. B. in Haskell tatsächlich funktionieren (Currying ist das Natürlichste überhaupt in dieser Sprache, und aufgrund seiner Faulheit ist eine Funktion, die eine Liste verwendet, einem Generatorausdruckg sehr ähnlich). Aber das entschuldigt mich nicht – langjährigen Python-Benutzer -, der BS schreibt. Danke für den Hinweis.

    Benutzer395760

    21. Juli 2010 um 21:05 Uhr


1034550cookie-checkWie man eine Reihe von Zahlen aufzählt, die bei 1 beginnen

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy