Django选择字段的Python智能循环列表创建

6 投票
5 回答
5332 浏览
提问于 2025-04-16 04:40

所以,下面的内容不是很“聪明”;)

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'))

撰写回答