2013-12-01 2 views
-3
dict = {'name': ['bob', 'bob, 'james', 'jeff'], 'last': ['bob', 'jeff', 'smith', 'jones']} 

Если элементы в списке равно указанному значению, сохранить этот элемент, еще , если оно не равно заданному значению удалить этот элемент по этому индексу в каждом ключе. Без использования импортаУдаление элементов в словаре

Ex:

>>> dict = {'name': ['bob', 'bob', 'james', 'jeff'], 'last': ['bob', 'jeff', 'smith', 'jones']} 
>>> process_dict(dict, 'name', 'bob') 
dict = {'name': ['bob', 'bob'], 'last': ['bob', 'jeff']} 

>>> dict = {'name': ['bob', 'bob', 'james', 'jeff'], 'last': ['bob', 'jeff', 'smith', 'jones']} 
>>> process_dict(dict, 'name', 'jeff') 
dict = {'name': ['jeff'], 'last': ['jones']} 

process_dict(dict, key, value): 
    pass 


>>> dict = {'name': ['bob', 'bob', 'james', 'jeff'], 'last': ['bob', 'jeff', 'smith', 'jones']} 
>>> process_dict(dict, 'name', 'bob') 

указанный ключ «имя» и заданное значение «боб», поэтому мы смотрим на ключ, «имя» перебирать значения и посмотреть, если элемент равен указанному значению, если оно есть, чем перейти к следующему ключу, и если это не удалить значение по этому индексу в каждом ключевом

Итак,

Первый элемент в 'name' равен 'bob', он равен указанному значению, поэтому мы пропустим его, следующий элемент - 'bob', а также , поэтому мы пропустим его, следующий элемент после этого не будет равен указано значение поэтому мы удаляем каждый элемент в каждой клавише в этом индексе,

мы теперь получим:

{'name': ['bob', 'bob', 'jeff'], 'last': ['bob', 'jeff', 'jones']} 

следующий элемент после того, как это «Джеф», который также не равно заданному значению, поэтому мы поэтому удалите каждый элемент в каждом ключе по этому индексу, мы получим , наконец, получим:

{'name': ['bob', 'bob'], 'last': ['bob', 'jeff']} 

Я не уверен, как начать с этим, так что я нужна помощь

+0

Начните с чтения о (http://docs.python.org/2/library/stdtypes.html#dict) – BartoszKP

+2

Мета-совет [интерфейс Dict в.]: Если чесно не смог бы написать что-нибудь * * для решения этой проблемы, тогда StackOverflow, вероятно, не является подходящим форумом. Мы очень хорошо разбираемся в дискретных проблемах, но мы не так хороши, как учебный сеанс. Например, мы склонны искать лучшее решение, о котором мы можем думать, и иногда это не то, что вам нужно. Сначала я попытаюсь освежить себя по более простым задачам. – DSM

+0

Не используйте 'dict' как имя переменной – dawg

ответ

2

Используйте enumerate, чтобы получить список индексов, где найдено соответствие, а затем перебрать dict.items() и отфильтровать все элементы, которые не в том Inde РЭС.

def process_dict(d, k, v): 
    indexes = [i for i, x in enumerate(d[k]) if x==v] #indexes where a match is found 
    return {k:[v[i] for i in indexes] for k, v in d.items()} 
... 
>>> d = {'name': ['bob', 'bob', 'james', 'jeff'], 'last': ['bob', 'jeff', 'smith', 'jones']} 
>>> process_dict(d, 'name', 'bob') 
{'last': ['bob', 'jeff'], 'name': ['bob', 'bob']} 
2

Построить набор соответствующих индексов (производится с enumerate(), затем выбрать те показатели при производстве нового словаря:

def process_dict(dct, key, value): 
    indices = [i for i, v in enumerate(dct[key]) if v == value] 
    return {key: [value[i] for i in indices] for key, value in dct.items()} 

Demo:

>>> def process_dict(dct, key, value): 
...  indices = [i for i, v in enumerate(dct[key]) if v == value] 
...  return {key: [value[i] for i in indices] for key, value in dct.items()} 
... 
>>> example1 = {'name': ['bob', 'bob', 'james', 'jeff'], 'last': ['bob', 'jeff', 'smith', 'jones']} 
>>> process_dict(example1, 'name', 'bob') 
{'last': ['bob', 'jeff'], 'name': ['bob', 'bob']} 
>>> example2 = {'name': ['bob', 'bob', 'james', 'jeff'], 'last': ['bob', 'jeff', 'smith', 'jones']} 
>>> process_dict(example2, 'name', 'jeff') 
{'last': ['jones'], 'name': ['jeff']} 
+0

Я просто играл с:' dict (zip (d.keys(), zip (* [val для ключа, val в zip (d ['name'], zip (* d.values ​​())) if key == 'bob']))) '- принимает равные списки длин, но выглядит круче :) –

Смежные вопросы