Способ получения определенных ключей из словаря

Я ищу способ получить определенные ключи из словаря.

В приведенном ниже примере я пытаюсь 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 

Есть ли лучший способ сделать это, чем выше?

В 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() для удаления элемента непосредственно из ключей.

Вы можете использовать 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])) 

подход с кросс-версией:

 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'} 

Не уверен, что вам нужно, но это даст вам результат.

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

Там не очень хороший способ сделать это, если вам нужно сохранить оригинальный словарь одинаковым.

Если вы этого не сделаете, вы можете нажать клавишу, которую вы не хотите, прежде чем получать ключи.

 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]) 

Вот небольшой пример, сравнивающий пару хороших размещенных решений:

 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 является правильным для этого сообщения

вы можете сделать это с пониманием 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