Удалить ключи из словаря на основе условий в Python - PullRequest
0 голосов
/ 27 июня 2018

У меня есть список словарей, в самих документах я хочу сохранить только слова из группы 3 (для бывшего «готового производства автомобилей») и после фильтрации я хочу сохранить верхние 2 грамма, которые основаны на значениях, и если значения одинаковы, то два верхних ключа в диктонике.

b=[{'america': 0.10640008943905088,
  'delete option snapshot': 0.18889748775492732,
  'done': 0.10918437741476256,
  'done auto manufacturing': 0.18889748775492732,
  'done auto delete': 0.18889748775492732,
  'overwhelmed': 0.1714953267142263,
  'overwhelmed sub': 0.18889748775492732,
  'overwhelmed sub value': 0.18889748775492732},
 {'delete': 0.17737631178689198,
  'delete invalid': 0.2918855502796403,
  'delete invalid data': 0.2918855502796403,
  'invalid': 0.19409701271823834,
  'invalid data': 0.2918855502796403,
  'invalid data sir': 0.2918855502796403,
  'nas': 0.14949544719217545,
  'nas server': 0.1632884084021329,
  'nas server replic': 0.2799865687396422}]

выход:

    b=[{'delete option snapshot': 0.18889748775492732,
  'done auto manufacturing': 0.18889748775492732,
  'done auto delete': 0.18889748775492732,
  'overwhelmed sub value': 0.18889748775492732},
 {'delete invalid data': 0.2918855502796403,
  'invalid data sir': 0.2918855502796403}]

Мое решение: это кажется неправильным.

for i in range(1, len(b)+1):
    for k,v in i.items():
        if len(re.findall(r'\w+',k[i])<3:
               del  b[k]

Ответы [ 3 ]

0 голосов
/ 27 июня 2018

i - это число, поэтому i.items() не имеет смысла. Поскольку i является индексом в списке, он должен быть b[i].items().

Но ваш диапазон неверен. Индексы списков начинаются с 0, а не 1, поэтому должно быть range(0, len(b)). Но Python предоставляет более простой способ перебора всех элементов списка:

for d in b:

Итак, чтобы отфильтровать все элементы, в ключе которых нет 3 слов, должно быть:

for d in b:
    for k in d:
        if len(re.findall(r'\w+',k)<3:
            del d[k]
0 голосов
/ 27 июня 2018

Попробуйте

out = []
for item in b:
    d = dict()
    for key in item.keys():
        if len(key.split())>2:
            d[key] = item[key]
    out.append(d)
0 голосов
/ 27 июня 2018

Всегда полезно использовать понимания. Потому что, как правило, вы не должны удалять элементы из списков или диктов, пока вы выполняете итерации по ним - это очень плохой стиль и может привести к ошибкам. Поэтому лучше создавать новые дикты и списки и заменять старый список новым. Для обновления дикта я бы использовал:

{k:v for k,v in d.items if len(v.split(" "))>2}

В этом случае d - это диктант. Теперь вы можете просто обновить / воссоздать список с пониманием списка:

result = [{k:v for k,v in d.items() if len(k.split(" "))>2} for d in b]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...