Używam Pythona 2.5, chcę wyliczenia w ten sposób (zaczynając od 1 zamiast 0):
[(1, 2000), (2, 2001), (3, 2002), (4, 2003), (5, 2004)]
Wiem, że w Pythonie 2.6 możesz zrobić: h = enumerate (range (2000, 2005), 1), aby uzyskać powyższy wynik, ale w pythonie 2.5 nie możesz ...
Korzystanie z python2.5:
>>> h = enumerate(range(2000, 2005))
>>> [x for x in h]
[(0, 2000), (1, 2001), (2, 2002), (3, 2003), (4, 2004)]
Czy ktoś zna sposób na uzyskanie pożądanego wyniku w Pythonie 2.5?
Dzięki,
Jeff
Odpowiedzi:
Jak już wspomniałeś, jest to łatwe do zrobienia w Pythonie 2.6 lub nowszym:
Python 2.5 i starsze nie obsługują tego
start
parametru, więc zamiast tego możesz utworzyć dwa obiekty zakresu i spakować je:Wynik:
Jeśli chcesz utworzyć generator zamiast listy, możesz zamiast tego użyć izip .
źródło
izip
ixrange
byłby bliżej wyliczeniaenumerate(iterable, start=1)
jak w Pythonie 2.6.Żeby umieścić to tutaj ze względu na potomność, w 2.6 dodano parametr "start" w celu wyliczenia w następujący sposób:
enumerate(sequence, start=1)
źródło
sequence[i]
w swoim kodzie.Łatwo, po prostu zdefiniuj własną funkcję, która robi to, co chcesz:
źródło
Python 3
Oficjalna dokumentacja:
enumerate(iterable, start=0)
Więc użyłbyś tego w ten sposób:
źródło
Najprościej zrobić w Pythonie 2.5 dokładnie to, o co pytasz:
Jeśli chcesz otrzymać listę, jak się wydaje, użyj
zip
zamiastit.izip
.(BTW, z reguły najlepszym sposobem na utworzenie listy z generatora lub innego iterowalnego X nie jest
[x for x in X]
, ale raczejlist(X)
).źródło
Teraz
h = list(enumerate(xrange(2000, 2005), 1))
działa.źródło
enumerate jest trywialne, a więc jest ponownie implementowane, aby zaakceptować start:
Należy zauważyć, że nie powoduje to złamania kodu przy użyciu wyliczenia bez argumentu start.
Alternatywnie, ten oneliner może być bardziej elegancki i prawdopodobnie szybszy, ale łamie inne zastosowania wyliczenia:To ostatnie było czystym nonsensem. @Duncan ma rację.
źródło
źródło
h = [(i + 1, x) for i, x in enumerate(xrange(2000, 2005))]
źródło
++
: tak to się robiOk, czuję się tu trochę głupio ... jaki jest powód, żeby tego nie robić po prostu z czymś takim
[(a+1,b) for (a,b) in enumerate(r)]
? Jeśli nie będziesz działać, nie ma też problemu:źródło
Ponieważ jest to dość rozwlekłe, polecam napisanie własnej funkcji, aby ją uogólnić:
źródło
Nie wiem, jak te posty mogłyby być bardziej skomplikowane niż następujące:
źródło