Вы цикл по ключам словаря и увеличивают i
одновременно. Это означает, что для 3-х клавиш i
происходит от 0 до 2, но в каждом значении (0 и 1) есть только 2 элемента. Это приводит к ошибке вашего индекса.
Вместо этого используйте zip()
в цикле по двум спискам, записывать индексы сохранить, а затем применить его ко всем значениям во всем словаре:
def where_clause_case_1(my_dict, b1, b2):
# build a set of indices to keep
keep = {i for i, (x, y) in enumerate(zip(my_dict[b1], my_dict[b2])) if x == y}
# build a new dictionary with kept indices
return {key: [v for i, v in enumerate(value) if i in keep] for key, value in my_dict.items()}
Последняя строка создает новый словарь, используя Dict понимание ({key_expression: value_expression for variables in sequence}
); в основном цикл, который строит ключи и значения для словаря. Он принимает ключи от my_dict
, но изменяет значения. Каждое значение построено с использованием понимания списка; другой цикл. Здесь мы принимаем все исходные значения только, когда их индекс находится в наборе keep
.
Без постижений, он бы выглядеть следующим образом:
def where_clause_case_1(my_dict, b1, b2):
# build a set of indices to keep
keep = set()
for i, (x, y) in enumerate(zip(my_dict[b1], my_dict[b2])):
if x == y:
keep.add(i)
# build a new dictionary with kept indices
retval = {}
for key, oldvalue in my_dict.items():
retval[key] = newvalue = []
for i, v in enumerate(oldvalue):
if i in keep:
newvalue.append(v)
return retval
Демо:
>>> def where_clause_case_1(my_dict, b1, b2):
... # build a set of indices to keep
... keep = {i for i, (x, y) in enumerate(zip(my_dict[b1], my_dict[b2])) if x == y}
... # build a new dictionary with kept indices
... return {key: [v for i, v in enumerate(value) if i in keep] for key, value in my_dict.items()}
...
>>> where_clause_case_1({'a': [1, 2], 'b': [1, 2], 'c':[3, 2]}, 'b', 'c')
{'a': [2], 'c': [2], 'b': [2]}
>>> where_clause_case_1({'a': [1, 2], 'b': [1, 2], 'c':[3, 2]}, 'a', 'b')
{'a': [1, 2], 'c': [3, 2], 'b': [1, 2]}
Ваш пример вызова не определяет 'b1' и' b2' аргументы. Ваша петля над клавишей тоже не имеет никакого смысла. –
Извините, я исправил это только сейчас. – user3014764
Ваш образец все еще не имеет смысла; списки для 'a' и' b' идентичны, поэтому нет никаких различий, чтобы оправдать удаление первого значения из списка. –