【问题标题】:adding to dict variable in list of dicts添加到字典列表中的字典变量
【发布时间】:2021-10-12 18:12:29
【问题描述】:

我有一个这样的字典列表:

students=
    [
    {rollno:1,firstname:f1,last_name:l1,total_marks:0},
    {rollno:2,firstname:f2,last_name:l2,total_marks:0},
    {rollno:3,firstname:f3,last_name:l3,total_marks:0}
    ]

然后我以

的形式循环输入
    rollno:1 english_marks:10
    rollno:2 english_marks:20
    rollno:5 social_marks: 30
    rollno:6 maths_marks:40
    rollno:1 science_marks:30
    rollno:2 science_marks:40

现在我想添加与正确卷号total_marks 变量相关的所有主题标记。 我怎样才能做到这一点?

for marks in marks_list:
   students[rollno] = ...?  # need help here : how can I access total_marks variable of that rollno?

【问题讨论】:

    标签: python list dictionary


    【解决方案1】:

    因为students 是一个没有键的列表,所以不能用除int 以外的任何东西来索引它,如果您尝试使用rollno 作为键,这对您没有帮助。假设您要使用已显示的数据结构(而不​​是创建新的数据结构),您必须遍历学生列表以找到所需的 rollno

    for marks in marks_list:
      for student in students:
        if student[rollno] == marks[rollno]:
           # you found the student whose rollno matches that of the mark, so do your stuff here
    

    还有其他方法可以使用速记、查找等来做到这一点,但既然你说你是 Python 新手,我认为最好看看原始循环在做什么。

    请注意,您不应该在循环访问任何集合时对其进行修改。因此,如果您想保存数据的任何突变,请务必创建一个副本或新列表。

    【讨论】:

    • 感谢您的回复...如果我们可以编辑学生数据结构...您建议它应该是什么样子...这样添加会很容易
    • IMO,学生数据结构应该是一个字典,键为rollno,值为字典的其余部分:students = {1: {firstname:f1,last_name:l1,total_marks:0}, {2: ...
    【解决方案2】:

    假设您的students 对象和元组列表(即(1, "maths_mark", 90))名称marks_list

    # Set up your basic data structure
    student_roll = {r.get("rollno"): {
        "firstname": r.get("firstname", "unknown"),
        "lastname": r.get("lastname", "unknown"),
        "total_marks": 0,
        "marks": {}
    } for r in students}
    
    # Convert your values into that structure
    for (roll_no, mark, score) in marks_list:
        roll = students_roll.get(roll_no)
        marks = roll.get("marks", {})
        score_list = marks.get(mark, [])
        score_list.append(score)
        marks[mark] = score_list
        # do the appropriate math to update r[total_marks] = ...
        student_roll[roll_no] = roll
    

    这将产生一个看起来像这样的字典:

    {
      1: {
        "firstname": "Joe",
        "lastname": "DeFalt",
        "total_marks": 20,
        "marks": {
          "english_marks": [10, 20],
          "math_marks": [30]
        },
      2: {
        "firstname": "Jessica",
        "lastname": "Bambino",
        "total_marks": 90,
        "marks": {
          "social_marks": [100, 70],
          "math_marks": [100]
        },
    }
    

    【讨论】:

      猜你喜欢
      • 2018-08-27
      • 1970-01-01
      • 2023-01-15
      • 2013-09-28
      • 1970-01-01
      • 2015-04-02
      • 2014-03-07
      • 2018-07-30
      • 1970-01-01
      相关资源
      最近更新 更多