簡體   English   中英

什么是迭代OrderedDict的最pythonic方式

[英]What is the most pythonic way to iterate over OrderedDict

我有一個OrderedDict,在循環中我想得到索引,鍵和值。 這肯定可以通過多種方式完成,即

a = collections.OrderedDict({…})
for i,b,c in zip(range(len(a)), a.iterkeys(), a.itervalues()):
  …

但我想避免范圍(len(a))並將a.iterkeys(),a.itervalues()縮短為類似a.iteritems()的東西。 使用枚舉和iteritems,可以將其改寫為

for i,d in enumerate(a.iteritems()):
  b,c = d

但它需要在循環體內解包。 有沒有辦法解析for語句或者更優雅的迭代方式?

您可以在for語句中使用元組解包:

for i, (key, value) in enumerate(a.iteritems()):
    # Do something with i, key, value

>>> d = {'a': 'b'}
>>> for i, (key, value) in enumerate(d.iteritems()):
...     print i, key, value
... 
0 a b

邊注:

在Python 3.x中,使用dict.items()返回可迭代的字典視圖。

>>> for i, (key, value) in enumerate(d.items()):
...     print(i, key, value)
$ python
Python 2.6.6 (r266:84292, Nov 21 2013, 10:50:32) 
[GCC 4.4.7 20120313 (Red Hat 4.4.7-4)] on linux2
Type "help", "copyright", "credits" or "license" for more information. 
>>> import collections
>>> a = collections.OrderedDict({'a':'1','b':'2'})
>>> a
OrderedDict([('a', '1'), ('b', '2')])
>>> for i, (k,v) in enumerate(a.iteritems()):
...    print i, k, v
... 
0 a 1
1 b 2

如果你問我,那很難看。

我不知道你為什么對索引感興趣。 dict之間的想法是你要對索引一無所知。 dict和隊列背后有很多邏輯,所以我們要擺脫索引。

如果你堅持獲得索引,就不需要迭代兩次。

讓我們看一下列舉的枚舉:

>>> seasons = ['Spring', 'Summer', 'Fall', 'Winter']    
>>> list(enumerate(seasons))
[(0, 'Spring'), (1, 'Summer'), (2, 'Fall'), (3, 'Winter')]
>>> list(enumerate(seasons, start=1))
[(1, 'Spring'), (2, 'Summer'), (3, 'Fall'), (4, 'Winter')]

注意“開始”。

Enumerate知道如何管理列表。 字典將數據存儲為列表,位於野獸的腹部。 那么如果我們在dict上使用枚舉會發生什么呢?

>>> for i,k in enumerate(a):
...    print i,k
... 
0 a
1 b

從這個角度來看,我會追求優雅:

>>> for i,k in enumerate(a):
...    print i,k,a[k]
... 
0 a 1
1 b 2

我覺得“對於我,(k,v)in”過早暴露了太多的內部結構。 使用“for i,k in”,我們受到保護,當重構時,我們不需要觸摸循環的方式。 我們只需要改變我們在循環中所做的事情。 少照顧一個方面。

更不用說這個枚舉的調用在2.6之后的任何python中都是一樣的:)

https://docs.python.org/2/library/stdtypes.html#dict.iteritems

https://docs.python.org/2/library/functions.html#enumerate

使用方法valuesitems來獲取view ,然后將其排版為iterator

例如,按字典中的值排序

sorted(iter(my_dict.values()))

暫無
暫無

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

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