我有一本字典:
a = {'100':12,'6':5,'88':3,'test':34, '67':7,'1':64 }
Run Code Online (Sandbox Code Playgroud)
我想根据键对这个词典进行排序,看起来像:
a = {'1':64,'6':5,'67':7,'88':3, '100':12,'test':34 }
Run Code Online (Sandbox Code Playgroud)
Mik*_*one 12
就像其他人都指出的那样,字典有自己的排序,你不能像列表那样对它们进行排序.
我想补充的一点是,如果你只想按排序顺序浏览字典的元素,那就是:
for k in sorted(a):
print k, a[k] # or whatever.
Run Code Online (Sandbox Code Playgroud)
如果您更喜欢列表理解(每个Alex):
sortedlist = [(k, a[k]) for k in sorted(a)]
Run Code Online (Sandbox Code Playgroud)
我想指出,Alex的使用key=int不适用于你的例子,因为你的一把钥匙是'test'.如果你真的希望他的数字在非数字之前排序,你必须传入一个cmp函数:
def _compare_keys(x, y):
try:
x = int(x)
except ValueError:
xint = False
else:
xint = True
try:
y = int(y)
except ValueError:
if xint:
return -1
return cmp(x.lower(), y.lower())
# or cmp(x, y) if you want case sensitivity.
else:
if xint:
return cmp(x, y)
return 1
for k in sorted(a, cmp=_compare_keys):
print k, a[k] # or whatever.
Run Code Online (Sandbox Code Playgroud)
或者你可能对你的密钥有足够的了解,可以编写一个函数将它们转换成一个正确排序的字符串(或其他对象):
# Won't work for integers with more than this many digits, or negative integers.
MAX_DIGITS = 10
def _keyify(x):
try:
xi = int(x)
except ValueError:
return 'S{0}'.format(x)
else:
return 'I{0:0{1}}'.format(xi, MAX_DIGITS)
for k in sorted(a, key=_keyify):
print k, a[k] # or whatever.
Run Code Online (Sandbox Code Playgroud)
这比使用cmp函数要快得多.
你不能dict在Python中排序,因为dict类型本质上是无序的.您可以做的是在使用sorted()内置函数使用之前对项目进行排序.您还需要一个辅助函数来区分数字键和字符串键:
def get_key(key):
try:
return int(key)
except ValueError:
return key
a = {'100':12,'6':5,'88':3,'test':34, '67':7,'1':64 }
print sorted(a.items(), key=lambda t: get_key(t[0]))
Run Code Online (Sandbox Code Playgroud)
但是在Python 3.1(和2.7)中,collections模块包含collections.OrderedDict可用于实现所需效果的类型,如下所示:
def get_key(key):
try:
return int(key)
except ValueError:
return key
a = {'100':12,'6':5,'88':3,'test':34, '67':7,'1':64 }
b = collections.OrderedDict(sorted(a.items(), key=lambda t: get_key(t[0])))
print(b)
Run Code Online (Sandbox Code Playgroud)
9年前我张贴的食谱是开始
字典无法排序 - 映射没有排序!
并展示了如何从字典的键和值中获取排序列表.
有了今天的Python,以及你表达的加上隐含的规范,我建议:
import sys
def asint(s):
try: return int(s), ''
except ValueError: return sys.maxint, s
sortedlist = [(k, a[k]) for k in sorted(a, key=asint)]
Run Code Online (Sandbox Code Playgroud)
这key=asint就是sorted为了排序目的而将这些字符串键视为整数的说法,以便例如'2'在'1'和之间进行排序'12',而不是在它们之间进行排序- 这就是您所需要的,以及所有非全数字键都排序全数字的.如果你还需要处理表示大于sys.maxint的整数的全数字键字符串,它有点棘手,但仍然可行:
class Infinity(object):
def __cmp__(self, other): return 0 if self is other else 1
infinite = Infinity()
def asint(s):
try: return int(s), ''
except ValueError: return infinite, s
Run Code Online (Sandbox Code Playgroud)
一般来说,如果从一开始就更精确地指定您的确切要求,您可以更快地获得更好的答案;-).