首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >python中的排序嵌套列表不起作用

python中的排序嵌套列表不起作用
EN

Stack Overflow用户
提问于 2021-09-19 18:55:26
回答 2查看 49关注 0票数 0

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

曼达纳,5,7,3,15

阿里,19,10,19,6,8,14,3

哈米德,3,9,4,20,9,1,8,16,0,5,2,4,7,2,1

索赫拉布,19,10,19,6,8,14,3

sara,0,5,20,14

索黑拉,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

阿里,1,9

sarvin,0,16,16,13,19,2,17,8

sheyda,0,16,16,13,19,2,17,8

当我使用函数进行排序时

代码语言:javascript
复制
   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

nahid,7.833333333333333

索希拉,7.833333333333333

sara,9.75

阿里,11.285714285714286

萨文,11.375

sheyda,11.375

sohrab,11.285714285714286

Sohrab在排序中不是真的。但是,当我更改Sohrab的名称时,例如Nima,排序是真的。我如何解决这个问题?

EN

回答 2

Stack Overflow用户

发布于 2021-09-19 19:09:34

您的排序关键字是一个元组:

代码语言:javascript
复制
lambda x: (int(x[1]), x[0])

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

代码语言:javascript
复制
(11, "ali")
(11, "sarvin")
(11, "sheyda")
(11, "sohrab")

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

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

票数 0
EN

Stack Overflow用户

发布于 2021-09-19 19:18:11

下面的方法似乎起作用了。您可以按新行拆分数据,每行拆分为名称和数字。计算每个人的平均值,并在列表中累积成对的person + mean。最后一步是按平均值对该对进行排序。

代码语言:javascript
复制
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)

输出

代码语言:javascript
复制
('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)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69246235

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档