标签:python-3-x python-2-7 dictionary comparison python
我试图将一些代码从Python 2移植到Python3.这很丑陋,但是我试图使Python 3的结果尽可能与Python 2的结果相同.我有与此类似的代码:
import json
# Read a list of json dictionaries by line from file.
objs = []
with open('data.txt') as fptr:
for line in fptr:
objs.append(json.loads(line))
# Give the dictionaries a reliable order.
objs = sorted(objs)
# Do something externally visible with each dictionary:
for obj in objs:
do_stuff(obj)
当我将此代码从Python 2移植到Python 3时,出现错误:
TypeError: unorderable types: dict() < dict()
所以我将排序行更改为:
objs = sorted(objs, key=id)
但是字典的顺序在Python 2和Python 3之间仍然发生了变化.
有没有办法在Python 3中复制Python 2比较逻辑?是ID之前使用过,在Python版本之间不可靠吗?
解决方法:
如果您希望在2.7(改为使用任意排序顺序)和3.x(拒绝对字典进行排序)中都与Python 2.x的早期版本具有相同的行为,那么Ned Batchelder’s answer to a question about how sorting dicts works可以帮助您解决问题,但并非全部方式.
首先,它为您提供了老式的cmp函数,而不是新型的键函数.幸运的是,2.7和3.x都具有functools.cmp_to_key
来解决该问题. (您当然可以将代码重写为一个关键函数,但这可能会使查看所发布的代码与您的代码之间的任何区别更加困难……)
更重要的是,它不仅在2.7和3.x中没有做同样的事情,甚至在2.7和3.x中也不起作用.要了解原因,请查看代码:
def smallest_diff_key(A, B):
"""return the smallest key adiff in A such that A[adiff] != B[bdiff]"""
diff_keys = [k for k in A if A.get(k) != B.get(k)]
return min(diff_keys)
def dict_cmp(A, B):
if len(A) != len(B):
return cmp(len(A), len(B))
adiff = smallest_diff_key(A, B)
bdiff = smallest_diff_key(B, A)
if adiff != bdiff:
return cmp(adiff, bdiff)
return cmp(A[adiff], b[bdiff])
注意,它在不匹配的值上调用cmp.
如果这些命令可以包含其他命令,则取决于cmp(d1,d2)最终将调用此函数的事实……显然在较新的Python中这是不正确的.
最重要的是,在3.x cmp中甚至不再存在.
此外,这还取决于任何值都可以与任何其他值进行比较的事实-您可以返回任意结果,但不会出现异常.在2.x中确实如此(在少数情况下除外),但在3.x中则并非如此.如果您不希望将字典与不可比较的值进行比较(例如,如果{1:2}< {1:'b'}可以引发异常,那么这对您来说可能不是问题),但是否则,是的. 当然,如果您不希望将任意结果用于dict比较,您是否真的想要任意结果用于值比较? 解决这三个问题的方法很简单:您必须替换cmp,而不是调用它.因此,如下所示:
def mycmp(A, B):
if isinstance(A, dict) and isinstance(B, dict):
return dict_cmp(A, B)
try:
return A < B
except TypeError:
# what goes here depends on how far you want to go for consistency
如果要比较2.7使用的不同类型对象的确切规则they’re documented,则可以实现它们.但是,如果您不需要那么多细节,则可以在此处编写更简单的内容(如果可以接受上述异常,甚至可以不捕获TypeError).
标签:python-3-x,python-2-7,dictionary,comparison,python 来源: https://codeday.me/bug/20191121/2050750.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。