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

时间:2014-01-11 13:25:08

标签: python python-3.x indexing iterable

在Python 3中获取OrderedDict第一项的最短方法是什么?

我最好的:

list(ordered_dict.items())[0]

相当漫长而丑陋。

我能想到:

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

但它不是很自我描述。

有更好的建议吗?

7 个答案:

答案 0 :(得分:33)

Readabililty的编程实践

一般来说,如果您觉得代码不是自我描述的,那么通常的解决方案是将其分解为一个命名良好的函数:

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())