有趣我也想出了其他方法。
>>> from collections import OrderedDict as OD
>>> attributes = OD((('brand','asus'), ('os','linux'), ('processor','i5'), ('memory','4G')))
,如果你想扭轉你可以做到這一點
>>> reverse = OD(attributes.items()[::-1])
或更Python的方法:
>>> reverse = OD(reversed(attributes.items()))
注意到你不需要創建list
項目已經是一個列表,而reversed
是一個生成器OrderedDict
將簡單迭代到它生成新的字典。
兩者都產生類似的時間。
$ python -m timeit "from collections import OrderedDict as OD; attributes = OD((('brand','asus'), ('os','linux'), ('processor','i5'), ('memory','4G')))" "reverse = OD(attributes.items()[::-1])"
10000 loops, best of 3: 54.8 usec per loop
$ python -m timeit "from collections import OrderedDict as OD; attributes = OD((('brand','asus'), ('os','linux'), ('processor','i5'), ('memory','4G')))" "reverse = OD(reversed(attributes.items()))"
10000 loops, best of 3: 54.4 usec per loop
$ python -m timeit "from collections import OrderedDict as OD; attributes = OD((('brand','asus'), ('os','linux'), ('processor','i5'), ('memory','4G')))" "reversed_attributes=OD(reversed(list(attributes.items())))"
10000 loops, best of 3: 54.4 usec per loop
如果要反轉:
>>> invert = OD(zip(*zip(*attributes.items())[::-1]))
或更Python:
>>> invert = OD(map(reversed, attributes.items()))
雙方再次產生類似的定時。
$ python -m timeit "from collections import OrderedDict as OD; attributes = OD((('brand','asus'), ('os','linux'), ('processor','i5'), ('memory','4G')));" "invert = OD(zip(*zip(*attributes.items())[::-1]))"
10000 loops, best of 3: 57 usec per loop
$ python -m timeit "from collections import OrderedDict as OD; attributes = OD((('brand','asus'), ('os','linux'), ('processor','i5'), ('memory','4G')));" "invert = OD(map(reversed, attributes.items()))"
10000 loops, best of 3: 56.8 usec per loop
$ python -m timeit "from collections import OrderedDict as OD; attributes = OD((('brand','asus'), ('os','linux'), ('processor','i5'), ('memory','4G')));" "inverted_attributes=OD([reversed(item) for item in attributes.items()])"
10000 loops, best of 3: 55.8 usec per loop
您可以結合使用這兩種方法來反轉和反轉。
這有效,但效率不高?通過使用反轉(列表(a.items()))這是否產生了很多開銷,所以不是pythonic? reverse_attributes也一樣。
東西能產生大量的開銷,是對另一方面的東西可以非常非常有效的,而不是很Python的Python的,這個詞已經被有點虐待,但是那只是我的意見
使出wikipedia:
Python社區中的一個常見新詞是pythonic,它可以與程序風格有廣泛的含義。要說代碼是pythonic,就是說它很好地使用了Python成語,它是自然的或者表現出流暢的語言。同樣,說一個接口或語言特性,它是pythonic是說,它適用於Python成語,它的使用與其他語言良好的銜接。
相反,unpythonic代碼的一個標誌是它試圖用Python編寫C++(或Lisp,Perl或Java)代碼 - 也就是說,它提供了一個粗略的轉錄,而不是來自另一種語言的表單的慣用翻譯。pythonicity的概念與Python的極簡主義可讀性哲學緊密相連,並且避免了「有多種方法可行」的方法。無法讀取的代碼或難以理解的習慣用法是不合理的。
爲:
但這種減少表現爲我們擴大規模?
這很難說,不知道爲什麼要做出這樣的變換,或者判斷你的系統的一個組成部分,從根本上裸minimun他們增加線性時間/空間開銷可能會或可能不會如果條目數量仍然很少,那麼沒有問題,但如果在每次請求時,假設這發生在網絡服務器上,那麼您的這些操作是在大量的字符上進行的,這可能會非常嚴酷,並且可能需要重新設計以避免這個。
'逆轉(名單(a.items()))'產生很大的開銷,因爲你無需創建一個'list',然後它迭代相反。刪除'list'構造函數會直接反轉'items'(不需要中間複製)。同樣,當初始化新OrderedDict時,你想使用一個生成器表達式(w/o'[]'),而不是列表理解,以避免創建無意義的中間列表。 – ShadowRanger 2015-10-19 13:48:56