Создание списка Smart Loop в Python для полей Django Choice - PullRequest
6 голосов
/ 28 сентября 2010

Итак. Следующее не очень «умно»;)

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 и хотел бы производить такие вещи "pythonically".

Например,

  • список кортежей с 1995 по текущий год.
  • список сокращенных месяцев года

Спасибо Stackers '

Ответы [ 5 ]

16 голосов
/ 28 сентября 2010
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'))
6 голосов
/ 28 сентября 2010

Попробуйте использовать 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)
3 голосов
/ 28 сентября 2010

См. Время модуля .

>>> 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(...).

1 голос
/ 25 октября 2015
import datetime
from django.db import models
from django.utils.dates import MONTHS


class MyCoolModel(models.Model):
    YEARS = YEARS = [(i,)*2 for i in range(1995, datetime.today().year + 1)]

    month = models.PositiveSmallIntegerField(choices=MONTHS.items())
    year = models.PositiveIntegerField(choices=YEARS)
0 голосов
/ 28 сентября 2010

Хотя некоторые другие ответы могут быть «умнее», мне не нравится идея использовать цикл для определения кортежа. Возможно, следующий компромисс более понятен:

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

YEARS = (
    ('1995',) * 2,
    ('1996',) * 2,
    ('1997',) * 2,
    ('1998',) * 2,
    ('1999',) * 2,
    ('2000',) * 2,
    ('2001',) * 2,
    ('2002',) * 2,
    ('2003',) * 2,
    ('2004',) * 2,
    ('2005',) * 2,
    ('2006',) * 2,
    ('2007',) * 2,
    ('2008',) * 2,
    ('2009',) * 2,
    ('2010',) * 2,
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...