如何在Python中将具有键的字典排序为一串数字

Jos*_*eph 9 python

我有一本字典:

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函数要快得多.


Ten*_*she 6

你不能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)


Ale*_*lli 5

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)

一般来说,如果从一开始就更精确地指定您的确切要求,您可以更快地获得更好的答案;-).