在Python 3中获取OrderedDict
第一项的最短方法是什么?
我最好的:
list(ordered_dict.items())[0]
相当漫长而丑陋。
我能想到:
next(iter(ordered_dict.items())) # Fixed, thanks Ashwini
但它不是很自我描述。
有更好的建议吗?
答案 0 :(得分:33)
一般来说,如果您觉得代码不是自我描述的,那么通常的解决方案是将其分解为一个命名良好的函数:
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)
从集, dict , OrderedDict ,生成器或其他不可索引集合中获取元素的常用方法是:< / p>
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)
答案 1 :(得分:8)
使用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)
有关详细信息,请查看collections上的手册。它也适用于Python 2.x。
答案 2 :(得分:2)
对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()))
答案 3 :(得分:0)
可读的代码,使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
答案 4 :(得分:0)
当您希望提取可迭代对象的 first 值时,推荐的解决方案next(iter(s))
适用于特定情况。如果可迭代的长度已知,则可以概括提取第 n 个值:
def get_nth_item(it, n=0):
if n < 0:
n += len(it)
for index, item in enumerate(it):
if index == n:
return item
raise IndexError(f'Iterable index {n} out of range')
这是一种清晰的意图,支持负索引和处理错误的索引(如果提供了错误的索引)。 OrderedDict
的用法示例:
from collections import OrderedDict
od = OrderedDict([(1, 'a'), (2, 'b'), (3, 'c')])
get_nth_item(od.items(), n=0) # (1, 'a')
get_nth_item(od.items(), n=-1) # (3, 'c')
get_nth_item(od.items(), n=3) # IndexError: Iterable index 3 out of range
答案 5 :(得分:0)
第一条记录:
[key for key, value in ordered_dict][0]
最新记录:
[key for key, value in ordered_dict][-1]
答案 6 :(得分:-5)
first = next #<hide this somewhere
first(ordered_dict.iteritems())