【问题标题】:Sum the elements in a list that contains string and integer and put the answer in another list python对包含字符串和整数的列表中的元素求和,并将答案放入另一个列表 python
【发布时间】:2019-03-15 10:54:02
【问题描述】:

我必须编写一个代码来汇总列表中每个学生的成绩并返回总分。 我的代码是:

list=['student1',10,20,40,'student2',20,20,40,'student3',20,30,40,'student4',20,10,30]
list2=[]
for i in range(0,len(list1),4):
    list2.append(list1[i])
    for j in range(len(list1)):
        if j%4 == 1:
            sum= list1[j]+list1[j+1]+list1[j+2]
            list2.append(sum)
print(list2)

预期的输出应该是这样的:

['student1', 70, 'student2', 80,'student3', 90, 'student4', 60]

但我得到了这个输出:

['student1', 70, 80, 90, 60, 'student2', 70, 80, 90, 60, 'student3', 70, 80, 90, 60, 'student4', 70, 80, 90, 60]

那么我的代码有什么问题?

【问题讨论】:

    标签: python python-3.x list sum jupyter-notebook


    【解决方案1】:

    你可以用单循环做到这一点:

    lst = ['student1', 10, 20, 40, 'student2', 20, 20, 40, 'student3', 20, 30, 40, 'student4', 20, 10, 30]
    result = []
    for i in range(0, len(lst), 4):
        result.extend((lst[i], sum(lst[i+1:i+4])))
    

    输出:

    ['student1', 70, 'student2', 80, 'student3', 90, 'student4', 60]
    

    如果每个学生的分数不同,例如:

    lst = ['student1', 10, 20, 'student2', 10, 20, 30, 'student3', 10, 20, 30, 40, 'student4', 10, 20, 30, 40, 50]
    

    然后:

    s = 0
    result = [lst[0]]
    for i in lst[1:]:
        try:
            s += int(i)
        except ValueError:
            result.extend((s, i))
            s = 0
    result.append(s)
    

    输出:

    ['student1', 30, 'student2', 60, 'student3', 100, 'student4', 150]
    

    【讨论】:

    • 那么你将4 替换为实际+1 标记数
    • @Alderven 我猜 Dirtybit 的意思是,如果每个学生都有不同的科目分数(意味着学生 1 的 4 个科目分数,学生 2 的 3 个科目分数,依此类推)
    • 然后你可以检查它的类:cur_sum = 0 cur = list[i] while not isinstance(cur, str): cur_sum += list[i]
    【解决方案2】:

    在您的第二个循环中,您再次遍历整个初始 list1,因此您总是附加所有总和。如果您的列表确实总是包含一个名称和三个等级,您可以改为摆脱第二个循环,而只使用第一个循环中的“i”作为总和的迭代器,就像您现在所做的那样。

    【讨论】:

      【解决方案3】:
      list1=['student1',10,20,40,'student2',20,20,40,'student3',20,30,40,'student4',20,10,30]
      list2=[]
      for i in range(0,len(list1),4):
          list2.append(list1[i])
          sum= list1[i+1]+list1[i+2]+list1[i+3]
          list2.append(sum)
      print(list2)
      

      产生

      ['student1', 70, 'student2', 80, 'student3', 90, 'student4', 60]
      

      代码中的第二个 for 循环遍历列表中的每个元素,并在索引 mod 4 为 1 时执行操作。您不需要两个 for 循环。

      【讨论】:

        【解决方案4】:

        它是这样的:0、4、8,所以你不需要第二个 for 循环。

        你已经知道数字在哪里了。(i+1,i+2,i+3) 并且 i 是学生姓名。

        list1=['student1',10,20,40,'student2',20,20,40,'student3',20,30,40,'student4',20,10,30]
        list2=[]
        for i in range(0, len(list1), 4):
            list2.append(list1[i])
            sum = list1[i+1]+list1[i+2]+list1[i+3]
            list2.append(sum)
        print(list2)
        

        【讨论】:

          【解决方案5】:

          试试

          in_lst = ['student1', 10, 20, 40, 'student2', 20, 20, 40, 'student3', 20, 30, 40, 'student4', 20, 10, 30]
          out_lst = []
          for x in range(0, len(in_lst), 4):
              student_entry = in_lst[x:x + 4]
              out_lst.append(student_entry[0])
              out_lst.append(sum(student_entry[1:]))
          print(out_lst)
          

          输出

          ['student1', 70, 'student2', 80, 'student3', 90, 'student4', 60]
          

          【讨论】:

            【解决方案6】:

            这里有解决方案,你不必担心学生的科目分数。

            list1=['student1',10,20,40,'student2',20,20,40,'student3',20,30,40,'student4',20,10,30]
            
            student_name =[]
            student_name_index =[]
            
            for i in range(len(list1)):        
                if type(list1[i]) == int:
                    pass
                else:
                    student_name.append(list1[i])
                    student_name_index.append(i)
            
            student_name_index.append(len(list1)-1)
            
            total_marks=[]
            
            for i in range(1,len(student_name_index)):
                total_marks.append(sum(list1[student_name_index[i-1]+1:student_name_index[i]]))
            
            final_result =[]
            
            for name, mark in zip(student_name,total_marks):
                final_result.append(name)
                final_result.append(mark)
            
            print(final_result)
            
            # output ['student1', 70, 'student2', 80, 'student3', 90, 'student4', 30] 
            

            【讨论】:

            • @DirtyBit 这就是你从 Alderven 那里问的问题
            猜你喜欢
            • 2017-11-04
            • 1970-01-01
            • 2013-01-24
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2023-03-31
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多