无法在python中获得所需的输出
在上述程序中,所有输出均正确无法在python中获得所需的输出,python,Python,在上述程序中,所有输出均正确 def dict_invert(d): ''' d: dict Returns an inverted dictionary according to the instructions above ''' result = {} for k, v in d.iteritems(): result.setdefault(v, []).append(k) return result 但是根据我
def dict_invert(d):
'''
d: dict
Returns an inverted dictionary according to the instructions above
'''
result = {}
for k, v in d.iteritems():
result.setdefault(v, []).append(k)
return result
但是根据我的作业,我需要{6:[2,4,6,8]}
作为输出。
我该怎么办
项目()
返回字典(键、值)对列表的副本
CPython实现细节:键和值以任意顺序列出,这是非随机的,在Python实现中有所不同,并且取决于字典的插入和删除历史
这同样适用于iteritems
在添加后尝试对其排序,如下所示:
a
Out[82]: {2: 6, 4: 6, 6: 6, 8: 6}
dict_invert(a)
Out[83]: {6: [8, 2, 4, 6]}
更新:
由于python的算法适合于对已经排序的数据进行排序,因此效率会很高。
如果您希望获得更高的效率,您可以这样使用:
由于数据量不大,并且没有任何复杂的自定义相等运算符(这是一个int比较),我相信您几乎看不到任何差异
但是,将dict重新创建为已排序的dict将浪费空间和CPU时间,因此建议不要这样做
更新2:
带基准的代码:
import bisect
def dict_invert(d):
'''
d: dict
Returns an inverted dictionary according to the instructions above
'''
result = {}
for k, v in d.iteritems():
bisect.insort(result.setdefault(v, []), k)
return result
python 2的输出:
import bisect
import timeit
d = {2: "6", 4: "6", 6: "6", 8:"6"}
def dict_invert(d):
'''
d: dict
Returns an inverted dictionary according to the instructions above
'''
result = {}
for k, v in d.iteritems():
bisect.insort(result.setdefault(v, []), k)
return result
def dict_invert2(d):
'''
d: dict
Returns an inverted dictionary according to the instructions above
'''
result = {}
for k, v in d.iteritems():
result.setdefault(v, []).append(k)
result[v].sort()
return result
def dict_invert3(d):
'''
d: dict
Returns an inverted dictionary according to the instructions above
'''
result = {}
for k, v in d.iteritems():
result.setdefault(v, []).append(k)
return {k: sorted(v) for k, v in result.iteritems()}
print(timeit.timeit("dict_invert(d)", setup="from __main__ import dict_invert, d"))
print(timeit.timeit("dict_invert2(d)", setup="from __main__ import dict_invert2, d"))
print(timeit.timeit("dict_invert3(d)", setup="from __main__ import dict_invert3, d"))
python 3的输出(将iteritems()
更改为items()
):
排序:
return{key:sorted(value)for key,value in result.items()}
继续工作,直到解决问题为止?不需要每次都排序。相反,您可以return[sorted(v)for v in result]
对几乎排序的列表进行排序不会因为python内部使用的算法而浪费CPU周期。但是,如果你真的想要,而且有大量的数据和大量的相等计算(不是这种情况),你可以使用对分。最终重新创建一个新的列表或目录是一种浪费。
import bisect
import timeit
d = {2: "6", 4: "6", 6: "6", 8:"6"}
def dict_invert(d):
'''
d: dict
Returns an inverted dictionary according to the instructions above
'''
result = {}
for k, v in d.iteritems():
bisect.insort(result.setdefault(v, []), k)
return result
def dict_invert2(d):
'''
d: dict
Returns an inverted dictionary according to the instructions above
'''
result = {}
for k, v in d.iteritems():
result.setdefault(v, []).append(k)
result[v].sort()
return result
def dict_invert3(d):
'''
d: dict
Returns an inverted dictionary according to the instructions above
'''
result = {}
for k, v in d.iteritems():
result.setdefault(v, []).append(k)
return {k: sorted(v) for k, v in result.iteritems()}
print(timeit.timeit("dict_invert(d)", setup="from __main__ import dict_invert, d"))
print(timeit.timeit("dict_invert2(d)", setup="from __main__ import dict_invert2, d"))
print(timeit.timeit("dict_invert3(d)", setup="from __main__ import dict_invert3, d"))
2.4553718788
2.59005746839
2.88147985275
2.56672796628521
2.999647860343478
3.4022091183182583