Разделение словаря в зависимости от имени ключа

#python #dictionary

Вопрос:

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

 dict = {'1_100': 50, '1_102': 100, '2_100': 150, '2_102': 200, '3_100': 50, '3_102': 100, ...}  narray = [1, 2, 3, 4, 5, ...]  

Я пытаюсь разделить словарь в зависимости от первого номера ключа

До сих пор я делал следующее:

 for k, v in dict.items():  for t in narray:  if str(t)   "_" in str(dict.keys()):     

Я не уверен, как выполнить фактическую часть разделения и обеспечить создание нового словаря, когда он столкнется с новым номером в ключе «X_». Обратите внимание, что у каждого ключа разное количество ключей, поэтому разделение каждого n-го числа не сработает

Я хочу в идеале закончить с

 dict1 = {'1_100': 50, '1_102': 100, ...} dict2 = {'2_100': 50, '2_102': 100, ...} dict3 = {'3_100': 50, '3_102': 100, ...} dictN = {'N_100': 50, 'N_102': 100, ...}  

Любая помощь будет очень признательна

Комментарии:

1. Являются ли числа во narray всех последовательных положительных целых числах?

2. @Reti43 да, это последовательные положительные целые числа

Ответ №1:

Попробуйте это:

 dcts = {str(n): {} for n in narray} for k, v in dct.items():  dcts[k.split('_')[0]][k] = v dcts = list(dcts.values())  

dct это ваш начальный словарь, dcts это список словарей (возможно, вы захотите удалить пустые).

Ответ №2:

 data = {'1_100': 50, '1_102': 100, '2_100': 150, '2_102': 200, '3_100': 50, '3_102': 100}  for k,v in data.items():  name = "dict"   k.split("_")[0]  d = globals().get(name, {})  d.update({k:v})  globals()[name] = d  print(dict1) print(dict2) print(dict3)  

Результат:

{‘1_100’: 50, ‘1_102’: 100}

{‘2_100’: 150, ‘2_102’: 200}

{‘3_100’: 50, ‘3_102’: 100}

Комментарии:

1. Добавление подобных имен в область видимости-плохая идея, потому что вам придется извлекать их с помощью аналогичного взлома, когда они вам понадобятся. Гораздо лучше либо создать список диктантов, либо диктанты диктантов.

2. Да, я знаю, я просто написал код таким образом, чтобы он был похож на его пример

3. ПРИВЕТ, спасибо тебе за это. Я должен пойти немного почитать о глобальной функции, так как я не использовал ее раньше

4. @Momo Я рекомендую не использовать их, а создать переменную results, которая имеет в качестве ключа имя и значение d. повторные результаты[имя] = d ; печать(результаты[«дикт1»])