集合上的 Python 迭代顺序

问题描述 投票:0回答:3

在Python中迭代相同的

set
是否保证我有完全相同的顺序(假设它相同的集合:我不会在两次迭代之间修改它),或者我应该将集合转换为首先列出,然后迭代列表?

python python-2.7 set iteration
3个回答
6
投票

Python 的字典和集合是稳定的,也就是说,如果你迭代它们而不改变它们,它们保证给你相同的顺序。这是来自 有关 dicts 的文档

键和值以任意顺序迭代,该顺序不是随机的,在 Python 实现中各不相同,并且取决于字典的插入和删除历史记录。如果对键、值和项目视图进行迭代而不对字典进行任何修改,则项目的顺序将直接对应。


3
投票

对未修改的集合进行迭代将始终给出相同的顺序。该顺序由当前值及其插入历史记录通知。

请参阅为什么字典和集合中的顺序是任意的?如果您对为什么感兴趣的话。

请注意,如果您想就地修改文件,那么只有当您的条目具有固定大小时才有效。文件无法在中间某个位置更新,因为该更新包含的字符比您替换的字符更少或更多。

文件中的数据就像磁带,你必须拼接更长或更短的片段来替换中间的数据,但你不能用文件来做到这一点。您必须重写替换后的键值对之后的所有内容,以使其余部分适合。


0
投票

正如已经指出的,字典和集合是稳定的,并且只要您不更改它就提供相同的顺序。如果您想要特定的订单,您可以使用OrderedDict

来自集合库文档:

>>> from collections import OrderedDict

>>> # regular unsorted dictionary
>>> d = {'banana': 3, 'apple':4, 'pear': 1, 'orange': 2}

>>> # dictionary sorted by key -- OrderedDict(sorted(d.items()) also works
>>> OrderedDict(sorted(d.items(), key=lambda t: t[0]))
OrderedDict([('apple', 4), ('banana', 3), ('orange', 2), ('pear', 1)])

>>> # dictionary sorted by value
>>> OrderedDict(sorted(d.items(), key=lambda t: t[1]))
OrderedDict([('pear', 1), ('orange', 2), ('banana', 3), ('apple', 4)])

>>> # dictionary sorted by length of the key string
>>> OrderedDict(sorted(d.items(), key=lambda t: len(t[0])))
OrderedDict([('pear', 1), ('apple', 4), ('orange', 2), ('banana', 3)])
© www.soinside.com 2019 - 2024. All rights reserved.