从字典中获取特定键的方法

时间:2016-08-30 13:29:59

标签: python dictionary

我正在寻找一种从字典中获取特定键的方法。

在下面的示例中,我正在尝试get all keys except 'inside'

>>> d
{'shape': 'unchanged', 'fill': 'unchanged', 'angle': 'unchanged', 'inside': 'a->e', 'size': 'unchanged'}
>>> d_keys = list(set(d.keys()) - set(["inside"]) )
>>> d_keys
['shape', 'fill', 'angle', 'size']
>>> for key in d_keys:
...     print "key: %s, value: %s" % (key, d[key])
...
key: shape, value: unchanged
key: fill, value: unchanged
key: angle, value: unchanged
key: size, value: unchanged

有没有比上面更好的方法呢?

8 个答案:

答案 0 :(得分:4)

在python 3.X中,大多数字典属性(如keys)返回一个视图对象,它是一个类似于对象的对象,所以你不需要将它转换为再次设置:

>>> d_keys = d.keys() - {"inside",}
>>> d_keys
{'fill', 'size', 'angle', 'shape'}

或者,如果您使用的是python2.x,则可以使用dict.viewkeys()

d_keys = d.viewkeys() - {"inside",}

但是,如果您只想删除一个项目,可以使用pop()属性从字典中删除相应的项目,然后调用keys()

>>> d.pop('inside')
'a->e'
>>> d.keys()
dict_keys(['fill', 'size', 'angle', 'shape'])

在python 2中,keys()返回列表对象,您可以使用remove()属性直接从键中删除项目。

答案 1 :(得分:1)

跨版本方法:

d = {'shape': 'unchanged', 'fill': 'unchanged',
    'angle': 'unchanged', 'inside': 'a->e', 'size': 'unchanged'}

d_keys = [k for k in d.keys() if k  != 'inside']

print(d_keys)

<强>输出:

['fill', 'shape', 'angle', 'size']

<小时/> 扩大一点:

def get_pruned_dict(d, excluded_keys):
    return {k:v for k,v in d.items() if k not in excluded_keys}

exclude = ('shape', 'inside')
pruned_d = get_pruned_dict(d, exclude)

print(pruned_d)

<强>输出

{'fill': 'unchanged', 'size': 'unchanged', 'angle': 'unchanged'}

答案 2 :(得分:1)

您可以使用内置的remove()。

d = {'shape': 'unchanged', 'fill': 'unchanged', 'angle': 'unchanged', 'inside': 'a->e', 'size': 'unchanged'}

d_keys = list(d.keys())
d_keys.remove('inside')

for i in d_keys:
    print("Key: {}, Value: {}".format(d_keys, d[d_keys]))

答案 3 :(得分:0)

如果您需要保持原始字典不变,那么这并不是一个好方法。

如果你没有,你可以在获得钥匙之前pop提供你不想要的钥匙。

d = {'shape': 'unchanged', 'fill': 'unchanged', 'angle': 'unchanged', 'inside': 'a->e', 'size': 'unchanged'}
d.pop('inside')
for key in d.keys():
     print "key: %s, value: %s" % (key, d[key])

这会改变d,所以如果你需要其他所有d,请不要使用它。您可以制作d的副本,但此时您只需迭代d.keys()的过滤副本即可。例如:

d = {'shape': 'unchanged', 'fill': 'unchanged', 'angle': 'unchanged', 'inside': 'a->e', 'size': 'unchanged'}
ignored_keys = ['inside']
for key in filter(lambda x: x not in ignored_keys, d.keys()):
     print "key: %s, value: %s" % (key, d[key])

答案 4 :(得分:0)

for key in d_keys:
    if key not in ['inside']:
        print "key: %s, value: %s" % (key, d[key])

答案 5 :(得分:0)

不确定你需要什么,但这会给你的结果。

for key in d.keys:
    if key != 'inside':
         print "key: %s, value: %s" % (key, d[key])

答案 6 :(得分:0)

这是一个比较几个好的发布解决方案的基准:

import timeit

d = {'shape': 'unchanged', 'fill': 'unchanged',
     'angle': 'unchanged', 'inside': 'a->e', 'size': 'unchanged'}


def f1(d):
    return d.viewkeys() - {"inside", }


def f2(d):
    return filter(lambda x: x not in ['inside'], d.viewkeys())

N = 10000000
print timeit.timeit('f1(d)', setup='from __main__ import f1, d', number=N)
print timeit.timeit('f2(d)', setup='from __main__ import f2, d', number=N)

# 5.25808963984
# 8.54371443087
# [Finished in 13.9s]

结论:f1不仅在可读性方面更好,而且在性能方面也更好。在python 3.x中,你会使用keys()代替。

所以我会说@Kasramvd回答是这篇文章的正确答案

答案 7 :(得分:-1)

你可以用dict理解来做到这一点,例如只能得到evens。

d = {1:'a', 2:'b', 3:'c', 4:'d'}
new_d = {k : v for k,v in d.items() if k % 2 == 0}

因为投诉你的案件。

d = {'shape': 'unchanged', 'fill': 'unchanged', 'angle': 'unchanged',         'inside': 'a->e'}
new_d = {k:v for k,v in d.items() if k != 'fill'}
#you can replace the k != with whatever key or keys you want