在Python 3中获取'OrderedDict'的第一项的最短方法

0aydgbwb  于 2022-11-26  发布在  Python
关注(0)|答案(6)|浏览(189)

在Python 3中,获取OrderedDict的第一项的最短方法是什么?
我最拿手的:

list(ordered_dict.items())[0]

很长很丑。
我可以想到:

next(iter(ordered_dict.items()))       # Fixed, thanks Ashwini

但这并不是自我描述。
有更好的建议吗?

ljsrvy3e

ljsrvy3e1#

可读性编程实践

一般来说,如果你觉得代码不是自我描述的,通常的解决方案是把它分解成一个名字很好的函数:

def first(s):
    '''Return the first element from an ordered collection
       or an arbitrary element from an unordered collection.
       Raise StopIteration if the collection is empty.
    '''
    return next(iter(s))

有了helper function,后续代码变得非常可读:

>>> extension = {'xml', 'html', 'css', 'php', 'xhmtl'}
>>> one_extension = first(extension)

从集合中提取单个值的模式

setdictOrderedDict、生成器或其他不可索引的集合中获取元素的常用方法是:

for value in some_collection:
    break

以及:

value = next(iter(some_collection))

后者更好,因为如果集合为空,next() 函数允许您指定一个默认值,或者您可以选择让它引发一个异常。next() 函数还明确表示它正在请求下一项。

替代方法

如果您确实需要索引、切片和其他序列行为(例如索引多个元素),那么使用list(some_collection)[itertools.islice()][2]将其转换为列表是一件很简单的事情:

s = list(some_collection)
print(s[0], s[1])

s = list(islice(n, some_collection))
print(s)
g6ll5ycj

g6ll5ycj2#

使用popitem(last=False),但请记住,它会从字典中删除条目,即具有破坏性。

from collections import OrderedDict
o = OrderedDict()
o['first'] = 123
o['second'] = 234
o['third'] = 345

first_item = o.popitem(last=False)
>>> ('first', 123)

要了解更多的细节,请参阅集合手册,它也适用于Python 2.x。

0x6upsns

0x6upsns3#

OrderedDict进行子类化并添加一个方法可以解决清晰度问题:

>>> o = ExtOrderedDict(('a',1), ('b', 2))
>>> o.first_item()
('a', 1)

ExtOrderedDict的实现:

class ExtOrderedDict(OrderedDict):
    def first_item(self):
        return next(iter(self.items()))
x7yiwoj4

x7yiwoj44#

代码是可读的,保持OrderedDict不变,并且不会为了得到第一个条目而不必要地生成一个可能很大的列表:

for item in ordered_dict.items():
    return item

如果ordered_dict为空,则隐式返回None。
在一段代码中使用的替代版本:

for first in ordered_dict.items():
    break  # Leave the name 'first' bound to the first item
else:
    raise IndexError("Empty ordered dict")

对应于上面第一个例子的Python 2.x代码需要使用iteritems()来代替:

for item in ordered_dict.iteritems():
    return item
a11xaf1n

a11xaf1n5#

您可能需要考虑使用SortedDict而不是OrderedDict
它提供SortedDict.peekitem来查看项目。
运行时复杂性:时间复杂度O(log(n))

>>> sd = SortedDict({'a': 1, 'b': 2, 'c': 3})
>>> sd.peekitem(0)
('a', 1)
lvmkulzt

lvmkulzt6#

第一个记录

[key for key, value in ordered_dict][0]

最后一条记录

[key for key, value in ordered_dict][-1]

相关问题