Как реализовать пейджинговое решение с помощью объекта dict в Python - PullRequest
0 голосов
/ 28 января 2012

Есть ли лучший способ реализовать решение для пейджинга с использованием dict, чем этот?

У меня есть dict с именами изображений и URL-адресами.Мне нужно 16 пар ключей-значений одновременно, в зависимости от запроса пользователя, то есть номера страницы.Это своего рода пейджинговое решение.Я могу реализовать это так:

Например:

dict = {'g1':'first', 'g2':'second', ... }

Теперь я могу создать отображение ключей на числа, используя:

ordered={}
for i, j in enumerate(dict):
    ordered[i]=j

И затем получить их:

dicttosent={}
for i in range(paegnumber, pagenumber+16):
  dicttosent[ordered[i]] = dict[ordered[i]]

Это правильный метод?Или это даст случайные результаты?

Ответы [ 4 ]

1 голос
/ 28 января 2012

1) Это даст случайные результаты?

Сортировка.

Цитирование из официальной документации о dict:

Ключи и значения перебираются в произвольном порядке, который не является случайным, зависит от реализации Python и зависит от истории вставок и удалений словаря.

Так что для ваших целей вы не можете априори знать, каков будет порядок вашей итерации.

OrderedDict - это то, что вы ищете: OrderedDict - это диктовка, которая запоминает порядок, в котором ключи были впервые вставлены.

2) Это действительно правильный метод?

Это не так.

Я не знаю, есть ли библиотека, которая будет обрабатывать всю эту информацию для вас (возможно, кто-то другой может сказать вам это), но похоже, что вы пытаетесь эмулировать поведение OrderedDict.

Вы можете напрямую использовать OrderedDict, или, если вы хотите перечислить вашу информацию, list может сделать это.

1 голос
/ 28 января 2012
  • Сохранить g1 , g2 и т. Д. В списке под названием imagelist
  • Получить страницы, используя imagelist[pagenumber: pagenumber+16].
  • Используйте исходный код (номера изображений в URL), чтобы найти URL для каждого из этих 16 изображений.
0 голосов
/ 28 января 2012

Почему бы просто не создать dict, который отображается на ваших страницах?Вы можете начать с двух списков, один из которых содержит имена ваших изображений, а другой - URL-адреса.

perPage = 16
nameList = ['g1', 'g2', ... ]
urlList = ['first', 'second', ... ]

# This is a generator expression that can create
# the nested dicts. You can also use a simple
# for loop
pageDict = dict(( (i, dict(( (nameList[j], urlList[j]) 
    for j in range(i*perPage, i*perPage+perPage))))
    for i in range(len(nameList) / perPage)))

Индексируется с 0, поэтому ваша первая страница будет pageDict[0].

... Теперь, когда я снова посмотрю на это, выражение генератора выглядит ужасно.: |

0 голосов
/ 28 января 2012

Это зависит.Если ваш dict не изменился в течение срока действия приложения, и вы не заботитесь о порядке пунктов в вашем документе, с вами все будет в порядке.

Если нет, вам, вероятно, следует использовать collections.OrderedDictили сохраните отсортированный список ключей, в зависимости от ваших требований.Использование обычного dict не дает никаких гарантий относительно порядка итераций, поэтому после каждой модификации входного dict вы можете получить разные результаты.

...