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

Ram*_*hum 38 python indexing iterable python-3.x

获取OrderedDictPython 3 第一项的最短方法是什么?

我最好的:

list(ordered_dict.items())[0]
Run Code Online (Sandbox Code Playgroud)

相当漫长而丑陋.

我能想到:

next(iter(ordered_dict.items()))       # Fixed, thanks Ashwini
Run Code Online (Sandbox Code Playgroud)

但它不是很自我描述.

有更好的建议吗?

Ray*_*ger 39

可读性的编程实践

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

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))
Run Code Online (Sandbox Code Playgroud)

使用该辅助函数,后续代码变得非常易读:

>>> extension = {'xml', 'html', 'css', 'php', 'xhmtl'}
>>> one_extension = first(extension)
Run Code Online (Sandbox Code Playgroud)

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

set,dict,OrderedDict,generator或其他不可索引的集合中获取元素的常用方法是:

for value in some_collection:
    break
Run Code Online (Sandbox Code Playgroud)

和:

value = next(iter(some_collection))
Run Code Online (Sandbox Code Playgroud)

后者很好,因为next()函数允许您在collection为空时指定默认值,或者您可以选择让它引发异常.在接下来的()函数也是明确的,它是要求的下一个项目.

替代方法

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

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

s = list(islice(n, some_collection))
print(s)
Run Code Online (Sandbox Code Playgroud)


ral*_*ien 12

使用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)
Run Code Online (Sandbox Code Playgroud)

有关更多详细信息,请查看集合手册.它也适用于Python 2.x.

  • 这对我来说是最好的办法,以防你不费心去毁掉字典 (2认同)

Bry*_*nta 5

子类化和添加一个方法OrderedDict将是清晰度问题的答案:

>>> o = ExtOrderedDict(('a',1), ('b', 2))
>>> o.first_item()
('a', 1)
Run Code Online (Sandbox Code Playgroud)

的实施ExtOrderedDict

class ExtOrderedDict(OrderedDict):
    def first_item(self):
        return next(iter(self.items()))
Run Code Online (Sandbox Code Playgroud)


Yit*_*ikC 5

可读的代码保持 OrderedDict 不变,并且不会不必要地生成一个可能很大的列表只是为了获取第一项:

for item in ordered_dict.items():
    return item
Run Code Online (Sandbox Code Playgroud)

如果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")
Run Code Online (Sandbox Code Playgroud)

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

for item in ordered_dict.iteritems():
    return item
Run Code Online (Sandbox Code Playgroud)