如何根据列表中的值对字典键进行排序?

6 投票
5 回答
5512 浏览
提问于 2025-04-15 19:14

我有一个字典和一个列表。字典里的键的值和列表里的值是对应的,我只是想知道怎么根据列表里的值来给字典里的值排序。

>>> l = [1, 2, 37, 32, 4, 3]
>>> d = {
    32: 'Megumi', 
    1: 'Ai',
    2: 'Risa',
    3: 'Eri', 
    4: 'Sayumi', 
    37: 'Mai'
}

我试过用类似这样的方式...

>>> sorted(dict.keys(), key=list.index)

...但显然这样只会返回按我想要的顺序排列的键。

(我应该在凌晨3点就意识到 listdict 这两个名字太糟糕了,所以我把它们改成了 ld。)

5 个回答

1

有序字典实际上是一个包含二元组的列表,因为在Python 2.x中没有内置的有序字典。你几乎找到了答案,只需要在排序键之后添加一个值的查找:

[(k,dict[k]) for k in sorted(dict.keys(), key=list.index)]

但是当某个键不在list中时,这样做就会失败。我们来做个修改,把所有这样的值放到排序的最后面,并按值进行排序:

def _index(x): # Allow non-full key list to be used in sorting
    try: return (list.index(x), x)
    except ValueError: return (sys.maxint, x)

[(k,dict[k]) for k in sorted(dict.keys(), key=_index)]
7

不要覆盖内置的 dictlist

>>> L = [1, 2, 37, 32, 4, 3]
>>> D = {
...     32: 'Megumi',
...     1: 'Ai',
...     2: 'Risa',
...     3: 'Eri',
...     4: 'Sayumi',
...     37: 'Mai'
... }

# Seems roundabout to use sorted here
# This causes an index error for keys in D that are not listed in L
>>> sorted(D.items(), key=lambda x:L.index(x[0]))
[(1, 'Ai'), (2, 'Risa'), (37, 'Mai'), (32, 'Megumi'), (4, 'Sayumi'), (3, 'Eri')]
>>>

# I think this is more direct than using sorted.
# This also ignores/skips keys in D that aren't listed in L
>>> [(i,D[i]) for i in L]
[(1, 'Ai'), (2, 'Risa'), (37, 'Mai'), (32, 'Megumi'), (4, 'Sayumi'), (3, 'Eri')]
>>>
5

你不应该把你的变量命名为 dict 和 list,因为这样的话,你就不能再使用内置的方法了。我在这个例子中把它们重命名了。

>>> l = [1, 2, 37, 32, 4]
>>> d = dict = {
...     32: 'Megumi', 
...     1: 'Ai',
...     2: 'Risa',
...     3: 'Eri', 
...     4: 'Sayumi', 
...     37: 'Mai'
... }

注意,在 Python 3.7 之前,你是不能对字典进行排序的(字典是根据键的哈希函数排序的哈希表)。为了绕过这个限制,出现了其他的字典实现方式,比如 OrderedDict

不过,你可以创建一个新的列表,这个列表包含了字典中的 (键, 值) 元组,并且这个列表是按照第一个元素排序的:

>>> s = list((i, d.get(i)) for i in L)
>>> print s
[(1, 'Ai'), (2, 'Risa'), (37, 'Mai'), (32, 'Megumi'), (4, 'Sayumi')]

或者如果你只对值感兴趣的话:

>>> s = list(d.get(i) for i in L)
>>> print s
['Ai', 'Risa', 'Mai', 'Megumi', 'Sayumi']

希望这些对你有帮助!

撰写回答