Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/355.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
无法在python中获得所需的输出_Python - Fatal编程技术网

无法在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