【问题标题】:Extract values from a list and create nested dictionary using python从列表中提取值并使用 python 创建嵌套字典
【发布时间】:2021-03-23 13:03:57
【问题描述】:

我正在尝试从列表中提取值并将其填充到嵌套字典中。

输入:

['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}]
  }
]

我可以使用 split 函数从输入列表中提取值并将其填充到一个普通字典中,但停留在我需要按键分组的点 first-name,last-name,class, roll-number 并在一个名为 ma​​rks 的通用键下收集其他键的列表。

另外,我需要字典中的键与上面指定的顺序相同。

【问题讨论】:

  • 到目前为止你尝试过什么?请分享您当前遇到的代码。

标签: python dictionary nested dictionary-comprehension ordereddictionary


【解决方案1】:

要按名称、班级和卷号对科目分数进行分组,您需要构建一个以这些值作为键的字典(我通过将它们与# 连接起来制作了一个字典,我认为该字符串不会出现在@ 987654322@ 或 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}
           ]
 }
]

【讨论】:

    【解决方案2】:

    简单。

    数据:

    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'}]}
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-11-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-09
      相关资源
      最近更新 更多