用于Django Choice字段的Python智能循环列表创建

Dar*_*ryl 6 python django

所以.以下不是很"聪明";)

MONTHS = (
    ('Jan', 'Jan'),
    ('Feb', 'Feb'),
    ('Mar', 'Mar'),
    ('Apr', 'Apr'),
    ('May', 'May'),
    ('Jun', 'Jun'),
    ('Jul', 'Jul'),
    ('Aug', 'Aug'),
    ('Sep', 'Sep'),
    ('Oct', 'Oct'),
    ('Nov', 'Nov'),
    ('Dec', 'Dec'),
)

YEARS = (
    ('1995', '1995'),
    ('1996', '1996'),
    ('1997', '1997'),
    ('1998', '1998'),
    ('1999', '1999'),
    ('2000', '2000'),
    ('2001', '2001'),
    ('2002', '2002'),
    ('2003', '2003'),
    ('2004', '2004'),
    ('2005', '2005'),
    ('2006', '2006'),
    ('2007', '2007'),
    ('2008', '2008'),
    ('2009', '2009'),
    ('2010', '2010'),
)
Run Code Online (Sandbox Code Playgroud)

我是python的新手,并且喜欢制作像'pythonically'这样的东西.

如,

  • 从1995年到当年的年元组列表.
  • 一年中缩写月份的列表

谢谢Stackers'

ars*_*ars 16

In [17]: from datetime import datetime

In [18]: tuple((str(n), str(n)) for n in range(1995, datetime.now().year + 1))
Out[18]:
(('1995', '1995'),
 ('1996', '1996'),
 ('1997', '1997'),
 ('1998', '1998'),
 ('1999', '1999'),
 ('2000', '2000'),
 ('2001', '2001'),
 ('2002', '2002'),
 ('2003', '2003'),
 ('2004', '2004'),
 ('2005', '2005'),
 ('2006', '2006'),
 ('2007', '2007'),
 ('2008', '2008'),
 ('2009', '2009'),
 ('2010', '2010'))

In [19]: import calendar

In [20]: tuple((m, m) for m in calendar.month_abbr[1:])
Out[20]:
(('Jan', 'Jan'),
 ('Feb', 'Feb'),
 ('Mar', 'Mar'),
 ('Apr', 'Apr'),
 ('May', 'May'),
 ('Jun', 'Jun'),
 ('Jul', 'Jul'),
 ('Aug', 'Aug'),
 ('Sep', 'Sep'),
 ('Oct', 'Oct'),
 ('Nov', 'Nov'),
 ('Dec', 'Dec'))
Run Code Online (Sandbox Code Playgroud)


Ann*_*rom 7

尝试使用zip()列出两元组.

MONTHS = ('Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec')
somemonth = models.TextField(max_length=3, choices=zip(MONTHS,MONTHS))
Run Code Online (Sandbox Code Playgroud)

choices将被设置为[('Jan', 'Jan'), ('Feb', 'Feb'), ...].


针对这个答案的评论,"元组"列表理解版本将是:

tuple((m, m) for m in MONTHS)
Run Code Online (Sandbox Code Playgroud)

与拉链版本对比:

tuple(zip(MONTHS, MONTHS))
Run Code Online (Sandbox Code Playgroud)

但严格地说,Django不需要一个选择元组,所以:

zip(MONTHS, MONTHS)
Run Code Online (Sandbox Code Playgroud)