Сначала у меня есть словарь d1, который выглядит так:
d1 = { 'w' : ['a', 'a', 'a', 'a', 'a', 'b', 'b', 'b', 'c', 'c'],
'x' : ['d', 'd', 'd', 'e', 'e'],
'y' : ['f', 'f', 'g'],
'z' : ['h', 'i']
}
Затем я перебираю этот словарь и создаю новый словарь, в котором каждое значение представляет собой список с двумя элементами: целым числом и списком. Целое число — это количество строк в этом значении в d1. Список содержит кортежи, каждый кортеж содержит строку из d1 (в позиции 1 кортежа) и количество раз, которое эта строка появлялась в d1 (в позиции 0 кортежа):
d2 = { 'w' : [10, [(5, 'a'), (3, 'b'), (2, 'c')],
'x' : [5, [(3, 'd'), (2, 'e')],
'y' : [3, [(2, 'f'), (1, 'g')],
'z' : [2, [(1, 'h'), (1, 'i')]
}
Я хочу удалить любую строку, которая появляется только один раз («g», «h» и «i»), поэтому в конце я хочу:
dFinal = { 'w' : [10, [(5, 'a'), (3, 'b'), (2, 'c')],
'x' : [5, [(3, 'd'), (2, 'e')],
'y' : [2, [(2, 'f')]
}
Я прочитал пример того, что я считаю пониманием словаря для удаления целых элементов словаря, если длина списка значений меньше 2:
d = {k:v for k,v in d.items() if len(v) > 1}
Я пытаюсь понять понимание списка/словаря и хотел бы использовать что-то подобное, чтобы достичь того, что я описал, и узнать что-то по пути.
Сначала я пытался написать функцию, которая принимала бы d2 в качестве аргумента, но я не знаю, как ссылаться на позицию 0 каждого кортежа.
Затем подумал, что, вероятно, будет намного проще сделать dFinal, используя d1, у которого нет кортежей, вместо того, чтобы пытаться изменить d2.
Если бы вы могли описать чистый способ сделать dFinal из d1 и/или d2 и объяснить ход мысли, я был бы очень признателен. Оба действительно помогли бы мне понять, как точно манипулировать списками словарей с включениями.
Спасибо!