簡體   English   中英

Python反向字典項目順序

[英]Python reverse dictionary items order

假設我有一本字典:

d = {3: 'three', 2: 'two', 1: 'one'}

我想重新排列這本字典的順序,以便字典是:

d = {1: 'one', 2: 'two', 3: 'three'}

我在想類似列表的reverse()函數,但那沒有用。 預先感謝您的回答!

從 Python 3.8 及更高版本開始,items 視圖可以反向迭代,所以你可以這樣做:

d = dict(reversed(d.items()))

在 3.7 和 3.6 上,他們還沒有在dictdict視圖上實現__reversed__issue33462: reversible dict ),所以使用中間listtuple ,它們支持反向迭代:

d = {3: 'three', 2: 'two', 1: 'one'}
d = dict(reversed(list(d.items())))

在 3.6 之前, 您需要collections.OrderedDict (用於輸入和輸出)才能獲得所需的結果。 普通dict直到 CPython 3.6(作為實現細節)和 Python 3.7(作為語言保證)才保留任何順序。

標准 Python 詞典(Python 3.6 之前)沒有順序,也不保證順序。 這正是創建OrderedDict的目的。

如果您的 Dictionary 是OrderedDict ,您可以通過以下方式反轉它:

import collections

mydict = collections.OrderedDict()
mydict['1'] = 'one'
mydict['2'] = 'two'
mydict['3'] = 'three'

collections.OrderedDict(reversed(list(mydict.items())))

另一個直接的解決方案,保證適用於 Python v3.7 及更高版本:

d = {'A':'a', 'B':'b', 'C':'c', 'D':'d'}
dr = {k: d[k] for k in reversed(d)}

print(dr)

輸出:

{'D': 'd', 'C': 'c', 'B': 'b', 'A': 'a'}

請注意,反向字典仍然被認為與其未反向的原始字典相同,即:

(d == dr) == True

作為對有人贊成此評論的回應,我很想知道哪種解決方案實際上更快。

像往常一樣,這取決於。 使用listreversed on the items 的解決方案將 10,000 項字典反轉 10,000 次會更快。 但是,將包含 1,000,000 個條目的字典逆向 100 次(即逆向字典中的條目總數相同,只是起始字典更大)理解速度更快——由讀者自行找出翻轉的確切點。 如果您處理大型詞典,如果性能很重要,您可能需要進行基准測試:

from random import randint
from timeit import timeit


def f1(d):
    return dict(reversed(list(d.items())))


def f2(d):
    return {k: d[k] for k in reversed(d)}


def compare(n):
    d = {i: randint(1, 100) for i in range(n)}
    print(timeit(lambda: f1(d), number=100000000 // n))
    print(timeit(lambda: f2(d), number=100000000 // n))


compare(10000)
compare(1000000)

結果(一次運行,典型結果):

4.1554735
4.7047593
8.750093200000002
6.7306311

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM