在Python 3中,获取OrderedDict的第一项的最短方法是什么?我最拿手的:
OrderedDict
list(ordered_dict.items())[0]
很长很丑。我可以想到:
next(iter(ordered_dict.items())) # Fixed, thanks Ashwini
但这并不是自我描述。有更好的建议吗?
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)
从 set、dict、OrderedDict、生成器或其他不可索引的集合中获取元素的常用方法是:
for value in some_collection: break
以及:
value = next(iter(some_collection))
后者更好,因为如果集合为空,next() 函数允许您指定一个默认值,或者您可以选择让它引发一个异常。next() 函数还明确表示它正在请求下一项。
如果您确实需要索引、切片和其他序列行为(例如索引多个元素),那么使用list(some_collection)或[itertools.islice()][2]将其转换为列表是一件很简单的事情:
list(some_collection)
[itertools.islice()][2]
s = list(some_collection) print(s[0], s[1]) s = list(islice(n, some_collection)) print(s)
g6ll5ycj2#
使用popitem(last=False),但请记住,它会从字典中删除条目,即具有破坏性。
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。
0x6upsns3#
对OrderedDict进行子类化并添加一个方法可以解决清晰度问题:
>>> o = ExtOrderedDict(('a',1), ('b', 2)) >>> o.first_item() ('a', 1)
ExtOrderedDict的实现:
ExtOrderedDict
class ExtOrderedDict(OrderedDict): def first_item(self): return next(iter(self.items()))
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
a11xaf1n5#
您可能需要考虑使用SortedDict而不是OrderedDict。它提供SortedDict.peekitem来查看项目。运行时复杂性:时间复杂度O(log(n))
SortedDict
SortedDict.peekitem
>>> sd = SortedDict({'a': 1, 'b': 2, 'c': 3}) >>> sd.peekitem(0) ('a', 1)
lvmkulzt6#
第一个记录:
[key for key, value in ordered_dict][0]
最后一条记录:
[key for key, value in ordered_dict][-1]
6条答案
按热度按时间ljsrvy3e1#
可读性编程实践
一般来说,如果你觉得代码不是自我描述的,通常的解决方案是把它分解成一个名字很好的函数:
有了helper function,后续代码变得非常可读:
从集合中提取单个值的模式
从 set、dict、OrderedDict、生成器或其他不可索引的集合中获取元素的常用方法是:
以及:
后者更好,因为如果集合为空,next() 函数允许您指定一个默认值,或者您可以选择让它引发一个异常。next() 函数还明确表示它正在请求下一项。
替代方法
如果您确实需要索引、切片和其他序列行为(例如索引多个元素),那么使用
list(some_collection)
或[itertools.islice()][2]
将其转换为列表是一件很简单的事情:g6ll5ycj2#
使用
popitem(last=False)
,但请记住,它会从字典中删除条目,即具有破坏性。要了解更多的细节,请参阅集合手册,它也适用于Python 2.x。
0x6upsns3#
对
OrderedDict
进行子类化并添加一个方法可以解决清晰度问题:ExtOrderedDict
的实现:x7yiwoj44#
代码是可读的,保持OrderedDict不变,并且不会为了得到第一个条目而不必要地生成一个可能很大的列表:
如果ordered_dict为空,则隐式返回None。
在一段代码中使用的替代版本:
对应于上面第一个例子的Python 2.x代码需要使用iteritems()来代替:
a11xaf1n5#
您可能需要考虑使用
SortedDict
而不是OrderedDict
。它提供
SortedDict.peekitem
来查看项目。运行时复杂性:时间复杂度O(log(n))
lvmkulzt6#
第一个记录:
最后一条记录: