2009-04-06 3 views
1

Je ne suis pas expierenced en python. Je dois définir le champ 'année' avec restriction de portée. Maintenant, j'utilise ce code, mais je pense qu'il existe une façon plus courte de le faire.Y at-il des moyens de définir 2-tuples dans une ligne?

YEAR_CHOICE = [] 
for year in range(2020,1899,-1): 
    YEAR_CHOICE += [(year, year)] 
year = models.PositiveSmallIntegerField('Year', choices=YEAR_CHOICE, default=0) 

Est-il possible de définir des 2-tuples dans une ligne? Peut être que je peux faire du champ ce dont j'ai besoin d'une autre manière? Je vous remercie!

Répondre

8

Vous devriez envisager d'utiliser un list comprehension:

YEAR_CHOICE = [(year,year) for year in xrange(2020,1899,-1)] 

Vous devriez également l'utilisation xrange au lieu de range. xrange est préféré car il renvoie les valeurs une par une plutôt que de créer la liste entière.

+0

Pour ceux qui ne peuvent pas avoir vu le terme avant, la recherche de « la compréhension de la liste » –

+0

ou cliquez sur le lien ajouté à ma réponse. –

+0

xrange() est l'utilisation préférée jusqu'à python 2.6. xrange() est interrompu dans python 3.0 et range() fonctionne dans 3.0 comme xrange() dans les versions précédentes. – hughdbrown

3

zip la gamme avec lui-même:

YEAR_CHOICE = zip(*[range(2020,1899,-1)]*2) 

ou utilisez list comprehension:

YEAR_CHOICE = [(year,year) for year in range(2020,1899,-1)] 
+0

Le code postal est intelligent, mais même une programmation Python expérimentée devrait y réfléchir pendant quelques instants pour savoir ce qu'il fait réellement et pourquoi cela fonctionne. Je recommande personnellement la compréhension de la liste plus longue mais plus claire. –

+0

Oui, zip (* [intervalle (2020,1899, -1)] * 2) est zip (gamme (2020,1899, -1), intervalle (2020,1899, -1)) – vartec

Questions connexes