【问题标题】:sort nested list in python don't work truepython中的排序嵌套列表不起作用
【发布时间】:2021-09-19 18:55:26
【问题描述】:

我正在尝试对嵌套列表进行排序。我有一个这样的输入文件:

曼陀罗,5,7,3,15
阿里,19,10,19,6,8,14,3
hamid,3,9,4,20,9,1,8,16,0,5,2,4,7,2,1
索拉布,19,10,19,6,8,14,3
萨拉,0,5,20,14
索黑拉,13,2,5,1,3,10,12,4,13,17,7,7
纳希德,13,2,5,1,3,10,12,4,13,17,7,7
阿里,1,9
萨文,0,16,16,13,19,2,17,8
谢达,0,16,16,13,19,2,17,8

当我用函数排序时

   def calculate_sorted_averages(input_file_name,output_file_name):
    with open (input_file_name) as f:

        reader=csv.reader(f)
        list1=list()
        for row in reader:
            name=row[0]
            these_grade=list()
            for grade in row[1:]:
                these_grade.append(float(grade))
                avg1=mean(these_grade)
            list1.append([name,avg1])
            print(list1)
        **list1.sort(key=lambda x: (int(x[1]), x[0]))**
        print(list1)
                      
    with open (output_file_name,'w',newline='') as outp:
        writer = csv.writer(outp)

        for item in list1:
            writer.writerow(item)
    
    outp.close()

输出文件是:

阿里,5.0
哈米德,6.066666666666666
曼陀罗,7.5
纳希德,7.833333333333333
索黑拉,7.833333333333333
萨拉,9.75
阿里,11.285714285714286
萨文,11.375
谢达,11.375
索拉布,11.285714285714286

Sohrab 在排序中不正确。但是当我更改 Sohrab'name 例如 Nima 时,排序是正确的。 我该如何解决这个问题?

【问题讨论】:

    标签: python python-3.x list average nested-lists


    【解决方案1】:

    您的排序键是一个元组:

    lambda x: (int(x[1]), x[0])
    

    通过转换为int,您可以使多个值具有相同的主键,这意味着它们将按它们的辅助键(它们的名称)进行排序。也就是说,你生成了四个元组:

    (11, "ali")
    (11, "sarvin")
    (11, "sheyda")
    (11, "sohrab")
    

    它们都具有相同的主值 (11),因此它们按字母顺序作为辅助键排序。

    删除int() 并按(x[1], x[0]) 排序应该可以满足您的需求。

    【讨论】:

    • 删除int 将不起作用。应该是float
    • x[1]mean() 的结果 - 那不是已经是 float 了吗?
    【解决方案2】:

    以下似乎有效。您按新行拆分数据,每行拆分为名称和数字。您计算每个人的平均值并在列表中累积一对人 + 平均值。最后一步是按平均值对这对进行排序。

    import statistics
    
    data = '''mandana,5,7,3,15
    ali,19,10,19,6,8,14,3
    hamid,3,9,4,20,9,1,8,16,0,5,2,4,7,2,1
    sohrab,19,10,19,6,8,14,3
    sara,0,5,20,14
    soheila,13,2,5,1,3,10,12,4,13,17,7,7
    nahid,13,2,5,1,3,10,12,4,13,17,7,7
    ali,1,9
    sarvin,0,16,16,13,19,2,17,8
    sheyda,0,16,16,13,19,2,17,8'''
    
    lines = data.split('\n')
    new_lines = []
    for line in lines:
      fields = line.split(',')
      new_lines.append((fields[0],statistics.mean(int(x) for x in fields[1:])))
    new_lines = sorted(new_lines,key= lambda x: x[1])
    for line in new_lines:
      print(line)
    

    输出

    ('ali', 5)
    ('hamid', 6.066666666666666)
    ('mandana', 7.5)
    ('soheila', 7.833333333333333)
    ('nahid', 7.833333333333333)
    ('sara', 9.75)
    ('ali', 11.285714285714286)
    ('sohrab', 11.285714285714286)
    ('sarvin', 11.375)
    ('sheyda', 11.375)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-12-17
      • 2011-04-14
      • 1970-01-01
      • 2012-10-25
      • 2014-03-31
      • 2018-03-17
      • 2010-09-21
      相关资源
      最近更新 更多