Django选择字段的Python智能循环列表创建
所以,下面的内容不是很“聪明”;)
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'),
)
我刚接触Python,想用更“Pythonic”的方式来做这些事情。
比如,
- 从1995年到现在的年份元组列表。
- 一年的缩写月份列表。
谢谢大家!
5 个回答
3
可以查看 time模块。
>>> import time
对于月份,我们可以使用 strptime
这个工具,把1到12的数字转换成 struct_time
这种格式,然后再用 strftime
把月份的名字提取出来。
>>> [time.strftime('%b', time.strptime(str(i), '%m')) for i in range(1, 13)]
['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']
年份就简单多了,我们只需要知道当前的年份(再加上一年,因为 range
的工作方式)。
>>> [str(i) for i in range(1995, time.localtime().tm_year + 1)]
['1995', '1996', '1997', '1998', '1999', '2000', '2001', '2002', '2003', '2004', '2005', '2006', '2007', '2008', '2009', '2010']
我加了 str(i)
是为了把年份变成字符串格式,因为你是这样写的。如果你觉得用整数也可以,那就可以省掉整个列表推导式,直接用 range(...)
就行了。
8
试试使用 zip()
来创建一个包含二元组的列表。
MONTHS = ('Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec')
somemonth = models.TextField(max_length=3, choices=zip(MONTHS,MONTHS))
choices
将会被设置为 [('Jan', 'Jan'), ('Feb', 'Feb'), ...]
。
针对这个答案的评论,使用“元组”列表推导的版本是:
tuple((m, m) for m in MONTHS)
与使用 zip 的版本相比:
tuple(zip(MONTHS, MONTHS))
但严格来说,Django 并不需要一个选择的元组,所以:
zip(MONTHS, MONTHS)
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'))