Извлеките значения из списка и создайте вложенный словарь с помощью python

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

Вход:

['abc-bcd_10_01_physics_90_70_20',
 'abc-bcd_10_01_chemistry_85_75_10',
 'ac-bd_10_03_biology_60_50_10',
 'ad-bcd_10_05_physics_70_50_20',
 'ac-bd_10_03_physics_65_50_15']

Ожидаемый результат:

[
  {'first-name' : 'abc',
    'last-name' : 'bcd',
    'class' : '10',
    'roll-number' : 1,
    'marks' : [{'subject':'physics',
              'total' : 90,
              'theory' : 70,
              'practical' : 20},
              {'subject':'chemistry',
              'total' : 85,
              'theory' : 75,
              'practical' : 10}]
  },
  {'first-name' : 'ac',
    'last-name' : 'bd',
    'class' : '10',
    'roll-number' : 3,
    'marks' : [{'subject':'biology',
              'total' : 60,
              'theory' : 50,
              'practical' : 10},
              {'subject':'physics',
              'total' : 65,
              'theory' : 50,
              'practical' : 15},
              ]
  },
  {'first-name' : 'ad',
    'last-name' : 'bcd',
    'class' : '10',
    'roll-number' : 5,
    'marks' : [{'subject':'physics',
              'total' : 70,
              'theory' : 50,
              'practical' : 20}]
  }
]

Я могу извлечь значения из входного списка с помощью функции разделения и заполнить его в обычном словаре, но застрял в точке, где мне нужно сгруппировать по ключам имя, фамилия, класс, номер рулона и собрать список других ключей под общим ключом, называемым метками.

Кроме того, мне нужно, чтобы ключи внутри словарей были в том же порядке, что и указанный выше.

что ты уже испробовал? Пожалуйста, поделитесь своим текущим кодом, где вы застряли.

Equinox 12.12.2020 09:10
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
1
229
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Чтобы сгруппировать предметные баллы по имени, классу и номеру броска, вам нужно создать словарь с этими значениями в качестве ключа (я сделал его, объединив их с помощью #, строка, которая, как я полагаю, не может встречаться в class или roll number), и затем вставьте каждый предмет в массив оценок. После того, как вы перебрали все входные данные, используйте dict.values для преобразования в список словарей:

from collections import defaultdict

marks = ['abc-bcd_10_01_physics_90_70_20',
 'abc-bcd_10_01_chemistry_85_75_10',
 'ac-bd_10_03_biology_60_50_10',
 'ad-bcd_10_05_physics_70_50_20',
 'ac-bd_10_03_physics_65_50_15']

results = defaultdict(dict)

for m in marks:
    name, classn, roll, subject, total, theory, practical = m.split('_')
    fn, ln = name.split('-')
    key = '#'.join([name, classn, roll])
    if key not in results:
        results[key] = { 'first_name' : fn,
                         'last_name' : ln,
                         'class' : classn,
                         'roll' : int(roll),
                         'marks' : []
                        }
    results[key]['marks'].append({ 'subject' : subject,
                                   'total' : int(total),
                                   'theory' : int(theory),
                                   'practical' : int(practical)
                                  })
    
results = list(results.values())
print(results)

Выход:

[
 {'first_name': 'abc',
  'last_name': 'bcd',
  'class': '10',
  'roll': 1,
  'marks': [{'subject': 'physics', 'total': 90, 'theory': 70, 'practical': 20}, 
            {'subject': 'chemistry', 'total': 85, 'theory': 75, 'practical': 10}
           ]
 },
 {'first_name': 'ac',
  'last_name': 'bd',
  'class': '10',
  'roll': 3,
  'marks': [{'subject': 'biology', 'total': 60, 'theory': 50, 'practical': 10}, 
            {'subject': 'physics', 'total': 65, 'theory': 50, 'practical': 15}
           ]
 },
 {'first_name': 'ad',
  'last_name': 'bcd',
  'class': '10',
  'roll': 5,
  'marks': [{'subject': 'physics', 'total': 70, 'theory': 50, 'practical': 20}
           ]
 }
]

Простой.

Данные:

d = ['abc-bcd_10_01_physics_90_70_20',
 'abc-bcd_10_01_chemistry_85_75_10',
 'ac-bd_10_03_biology_60_50_10',
 'ad-bcd_10_05_physics_70_50_20',
 'ac-bd_10_03_physics_65_50_15']
L = []
for m in d:
    first_name, last_name = m.split("-")[:2]
    last_name = last_name.split("_")[0]
    class_, roll_number, subject = m.split("_")[1:4]
    total, theory, practical = m.split("_")[4:]
    L.append([first_name, last_name, class_, roll_number, subject, total, theory, practical])
L = sorted(L, key=lambda x:x[:2])

d = {}
processed = []
for i in L:
    f = dict(zip(['first_name', 'last_name', 'class', 'roll_number', 'subject', 'total', 'theory', 'practical'], i))
    if i[:2] in processed:
        d['-'.join(i[:2])].append(f)
    else:
        d['-'.join(i[:2])] = [f]
        processed.append(i[:2])
import pprint
pprint.pprint(d)
{'abc-bcd': [{'class': '10',
              'first_name': 'abc',
              'last_name': 'bcd',
              'practical': '20',
              'roll_number': '01',
              'subject': 'physics',
              'theory': '70',
              'total': '90'},
             {'class': '10',
              'first_name': 'abc',
              'last_name': 'bcd',
              'practical': '10',
              'roll_number': '01',
              'subject': 'chemistry',
              'theory': '75',
              'total': '85'}],
 'ac-bd': [{'class': '10',
            'first_name': 'ac',
            'last_name': 'bd',
            'practical': '10',
            'roll_number': '03',
            'subject': 'biology',
            'theory': '50',
            'total': '60'},
           {'class': '10',
            'first_name': 'ac',
            'last_name': 'bd',
            'practical': '15',
            'roll_number': '03',
            'subject': 'physics',
            'theory': '50',
            'total': '65'}],
 'ad-bcd': [{'class': '10',
             'first_name': 'ad',
             'last_name': 'bcd',
             'practical': '20',
             'roll_number': '05',
             'subject': 'physics',
             'theory': '50',
             'total': '70'}]}

Другие вопросы по теме