我正在寻找以词典和键名作为输入的最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}
有没有更好的建议(更干净和/或更简单的代码)?
谢谢。
答案 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