将有序字典用作有序字典

2024-04-25 14:05:52 发布

您现在位置:Python中文网/ 问答频道 /正文

既然Python3.7使用了保序dictsofficially part of the language spec而不是实现细节,我一直在努力思考如何最好地使用这个属性。今天,我发现我需要一个保序集,我想字典也许能解决这个问题。在

假设我们有一个散列元素列表。我们需要一个唯一条目的列表,并且我们希望根据第一次出现来保持这些条目的顺序。一个简单的字典构造器应该做到:

ls = "Beautiful is better than ugly. Explicit..."
uniques = list({s:0 for s in ls})

>>> ['B', 'e', 'a', 'u', 't', 'i', 'f', 'l', ' ', 's', 'b', 'r', 'h', 'n', 'g', 'y', '.', 'E', 'x', 'p', 'c']

这将保留第一次出现时的顺序,并清除所有重复项。在

我想知道社区对这个用例和订单保持特性的总体看法。在

  • 有什么理由不应该使用这种方法?在
  • 有更好的方法来解决这个问题吗?在
  • 这个方法是Python吗?在

通过阅读Python的禅,我感到很矛盾。该方法简单,但依赖于隐式排序。在

请告诉我你的想法。谢谢您。在


Tags: ofthe方法目的列表字典属性顺序
2条回答

这种使用Python3.7字典作为保序重复数据消除的方法是由Python核心开发人员here审查的。没有比这更好的推荐了。在

Is there any reason this method shouldn't be used?

没有

Are there better ways to solve this problem?

没有

Is this method Pythonic?

是的。在

The method is simple but relies on implicit ordering.

您的问题标记为python-3.7。保证字典保留插入顺序,所以这里没有隐式排序。在

这在python3.7上非常有用!。。但是python3.7并不是唯一的Python版本。在相当长的一段时间内,依赖dict顺序保存将是一个危险的习惯,因为如果您的代码运行在Python 3.6之前的版本上,它将停止维护顺序,完全安静。在

例如,依赖dataclassescontextvars并不危险,因为如果你试图在一个没有dataclasses的Python上运行依赖dataclasses的代码,就会得到一个很大的、清晰的ImportError。失去秩序的话语并没有同样明显的表现。在

你可能不知道它已经停止维持秩序了。你可能不记得你依赖于口述命令。您可能会忘记记录或告诉任何人您依赖它,或者您可能是一个糟糕的程序员,因为您继承了其他人依赖dict命令的代码,而没有记录python3.7+的需求。您可能不知道您忘记在一台特定的机器上更新Python,或者您不小心从Anaconda或其他什么地方掉了出来,而您使用的是仍然使用3.4的系统python3。在

最终还是可以用dict命令。目前,尤其是3.7发布几天后,最好使用OrderedDict,或者添加版本检查:

import collections
import sys

_make_ordered_mapping = (dict.fromkeys if sys.version_info >= (3, 7)
                         else collections.OrderedDict.fromkeys)

def ordered_dedup(items):
    return list(_make_ordered_mapping(items))

相关问题 更多 >