запутанный порядок python urlencode - PullRequest
5 голосов
/ 28 июля 2010

хорошо, так что согласно http://docs.python.org/library/urllib.html

"Порядок параметров в закодированной строке будет соответствовать порядку кортежей параметров в последовательности."

кроме случаев, когда я пытаюсь запустить этот код:

import urllib
values ={'one':'one',
         'two':'two',
         'three':'three',
         'four':'four',
         'five':'five',
         'six':'six',
         'seven':'seven'}
data=urllib.urlencode(values)
print data

выводит как ...

seven=seven&six=six&three=three&two=two&four=four&five=five&one=one

7,6,3,2,4,5,1

Это не похоже на порядок моих кортежей.

Ответы [ 3 ]

22 голосов
/ 28 июля 2010

Словари изначально неупорядочены из-за того, как они реализованы.Если вы хотите, чтобы они были упорядочены, вместо этого вы должны использовать список кортежей (или кортеж списков, или кортеж кортежей, или список списков ...):

values = [ ('one', 'one'), ('two', 'two') ... ]
5 голосов
/ 23 марта 2016

На случай, если кто-то придет сюда, например я, в поисках способа получения детерминированных результатов из urlencode, для кодирования значений в алфавитном порядке, вы можете сделать это следующим образом:

from urllib.parse import urlencode
values ={'one':'one',
         'two':'two',
         'three':'three',
         'four':'four',
         'five':'five',
         'six':'six',
         'seven':'seven'}
sorted_values = sorted(values.items(), key=lambda val: val[0])
data=urlencode(sorted_values)
print(data)
#> 'five=five&four=four&one=one&seven=seven&six=six&three=three&two=two'
0 голосов
/ 30 января 2019

Почему бы не использовать OrderedDict? Ваш код будет выглядеть так:

from collections import OrderedDict

d = OrderedDict()
d['one'] = 'one'
d['two'] = 'two'
d['three'] = 'three'
d['four'] = 'four'
...

# Outputs "one one", "two two", "three three", "four four", ...
for key in d:
    print(key, d[key])

Таким образом, порядок вашего словаря будет сохранен

...