将字典作为输入并返回子字典作为输出的pythonic方法

时间:2017-07-28 10:56:45

标签: python python-2.7

我正在寻找以词典和键名作为输入的最pythonic方式,并返回没有键(及相关值)作为输出的字典。

这是我到目前为止所提出的:

def SubDict(inputDict,inputkey):
    return dict([(key,val) for key,val in inputDict.iteritems() if key != inputkey])

测试用例:

print SubDict({'a':1,'b':2,'c':3},'b')

给出:

{'a': 1, 'c': 3}

有没有更好的建议(更干净和/或更简单的代码)?

谢谢。

2 个答案:

答案 0 :(得分:4)

好吧,你的理解力也可以用dictionary display代替:

{key:val for key,val in inputDict.iteritems() if key != inputkey}

但复制和删除实际上可能更快,因为查找是O(1)。由于过滤器,Python不会事先知道字典的大小,并且哈希表的增长成本可能会很高。

def SubDict(inputDict, inputkey):
    subdict = inputDict.copy()
    del subdict[inputkey]
    return subdict

这也很可读。

如果您想在找不到inputkey时默默忽略该案例,则可以将del替换为subdict.pop(inputkey, None)。这提供了一个默认值(我们忽略),而不是进行双重检查。

答案 1 :(得分:1)

这个怎么样,另一种方式:

d = {'a': 1, 'b': 2, 'c': 3}

def filtered_dict(inputdict, inputkey):
    return dict(zip(filter(lambda x: x != inputkey, inputdict), inputdict.values()))

{'a': 1, 'c': 3}


%timeit SubDict(d, 'b')
The slowest run took 10.13 times longer than the fastest. This could mean that an intermediate result is being cached.
1000000 loops, best of 3: 306 ns per loop


%timeit filtered_dict(d, 'b')
The slowest run took 7.26 times longer than the fastest. This could mean that an intermediate result is being cached.
100000 loops, best of 3: 3.02 µs per loop