我正在尝试对嵌套列表进行排序。我有一个这样的输入文件:
曼达纳,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
当我使用函数进行排序时
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,排序是真的。我如何解决这个问题?
发布于 2021-09-19 19:09:34
您的排序关键字是一个元组:
lambda x: (int(x[1]), x[0])通过转换为int,您可以使多个值具有相同的主键,这意味着它们将按照它们的辅键和名称进行排序。也就是说,您将生成四个元组:
(11, "ali")
(11, "sarvin")
(11, "sheyda")
(11, "sohrab")它们都具有相同的主值(11),因此它们作为辅键按字母顺序排序。
删除int()并按(x[1], x[0])排序应该可以满足您的需求。
发布于 2021-09-19 19:18:11
下面的方法似乎起作用了。您可以按新行拆分数据,每行拆分为名称和数字。计算每个人的平均值,并在列表中累积成对的person + mean。最后一步是按平均值对该对进行排序。
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)https://stackoverflow.com/questions/69246235
复制相似问题