سلام من دارم روی یک پروژه کار میکنم که اطلاعات از csv بخونه و معدل افراد مختلف حساب کنه وقتی معدل ها حساب کرد اون رو sort کنه و به کاربر نمایش بده حالا توی یک تابع جدید میخوام اطلاعات sort شده که شامل دیکشنری میشه ماکزیمم نمرات به همراه اسم دانشجوها نمایش داده بشه هر چیه سرچ کردم فهمیدم با lambda و کتابخانه operator میشه نوشت تلاش کردم از هر دو راه ولی نتیجه نگرفتم
import csv,operator
from statistics import mean
def calculate_three_best(input_file_name, output_file_name):
d = dict()
with open(path) as file:
reader = csv.reader(file)
for person in reader:
name = person[0]
grade = list()
for avarge in person[1:]:
grade.append(int(avarge))
d[name] = mean(grade)
for x in d.items():
name_max = max(d.items(), key = operator.itemgetter(1))[0]
print(name_max)
#del name_max
del d['sarvin']
two_max = max(d.items(), key = operator.itemgetter(1))[0]
print(two_max_max)
tree_max = max(d.items(),key = operator.itemgetter(1))[0]
#two_max = max(d.items(), key = operator.itemgetter(1))[0]
'''
r = {'ali': 5, 'hamid': 6.066666666666666, 'mandana': 7.5, 'soheila': 7.833333333333333, 'sara': 9.75, 'sina': 11.285714285714286, 'sarvin': 11.375}
#خروجی درست برای نمایش
sarvin,11.375
sina,11.285714285714286
sara,9.75
توی کد بالا قصد داشتم هر بار با itemgetter یک ماکزیمم کلید بخونم و بار بعدی کلید دوم و در آخر از value لیست بسازم و پرینت بگیرم اما قشنگ گیج شدم یکی کمک کنه واقعا دو هفته درگیر این فانکشن هستم :(
سلام
دوست عزیز شما خیلی مبحث رو پیچیده کردید ، در واقع نیاز به هیچ کتابخانه و ماژول مجزایی برای انجام این کار نیست
تابع ()list.sort
به صورت پیش فرض عملیات مرتب سازی را بر اساس معیار های خود انجام میدهد که به عنوان مثال در اعداد که مشخص است و در حروف بر اساس ترتیب الفبا و در انواع دیگر داده ها باید الگو را یافت.
اما معیار مرتب سازی در این تابع را به صورت کاستوم یا دستی هم میتوان تعیین کرد ، کافی است یک فانکشن که مقداری بگیرد و مقداری خروجی دهد (غالبا lambda function بهترین گزینه است) را به پارامتر key این تابع تحویل دهیم !
به عنوان مثال یک لیست تودرتو از اعداد داریم و میخواهیم بر اساس عدد آخر آنها مرتب سازی شوند :
numbers = [
[11,61,32,75,110],
[12,54,123,54,81],
[92,86,237,23,77],
]
numbers.sort(key=lambda x:x[-1])
print(numbers)
#output :
#[[92, 86, 237, 23, 77], [12, 54, 123, 54, 81], [11, 61, 32, 75, 110]]
به صورت پیش فرض به صورت نزولی مرتب سازی می کند ، برای اینکه ترتیب صعودی شود ، کافی است پارامتر reverse
را برابر True
قرار دهیم
numbers = [
[11,61,32,75,110],
[12,54,123,54,81],
[92,86,237,23,77],
]
numbers.sort(key=lambda x:x[-1], reverse=True)
print(numbers)
# output :
#[[11, 61, 32, 75, 110], [12, 54, 123, 54, 81], [92, 86, 237, 23, 77]]
و این هم فانشکن شما که من دوباره نوشتمش :
import csv
def calculate_three_best(input_file_name):
#data sorted list
data = []
#read the persons data file
with open(input_file_name) as file:
persons_data = csv.reader(file)
#iterate on persons data reded
for person in persons_data:
#name of person
name = person[0]
#calculate grade of person
scores = person[1:]
scores = list(map(int, scores))
grade = sum(scores) / len(scores)
#add new person data to data
new_person = (name, grade) #tuple
data.append(new_person)
#sorting output data
#reverse == True : Descending
#reverse == False : Ascending
data.sort(key=lambda x:x[1], reverse=True)
#show out put
for user in data:
print(user[0], user[1])
calculate_three_best("test.csv")
سلام ببخشید بابت تاخیر من برنامه نوشتم اما مشکلی که داره اسامی هر بار آپدیت نمیکنه و روی فرد اول میمونه الان باید چیکار کنم این کدی هم که شما گذاشته بودید از map ایراد میگیره و پایتون 3 ارور int error میده میشه بهم کمک کنید سورس جدید باز میزارم اینجا ؟
سوال
سه معدل برتر را با نام هر فرد ذخیره کند.
def calculate_three_best(input_file_name, output_file_name):
d = dict()
count = 0
with open(path, newline="", encoding="utf-8") as file:
reader = csv.reader(file)
for person in reader:
name = person[0]
grade = []
for avarge in person[1:]:
grade.append(int(avarge))
d[name] = mean(grade) # make dict mean
for counter in d.items():
data = list(d.values())
data.sort(reverse = True)
#print(data)
r = max(d, key=d.get) # find max point in mean
print(r)
#x = sorted(data) # sorted point students
for num in data:
print(r,num)
count+= 1
خروجی درست
#sarvin,11.375
#sina,11.285714285714286
#sara,9.75
خروجی برنامه من
sarvin 11.375
sarvin 11.285714285714286
sarvin 9.75
sarvin 7.833333333333333
sarvin 7.5
sarvin 6.066666666666666
sarvin 5
هدف خودم اینه که یک for بنوسیم که هر بار ماکزیمم کلید دیکشنری بدست بیاره اون توی لیست بزاره و بعد با دستور reverse اعداد بزرگ بدست بیاد و در نهایت توی یک حلقه دیگه نمرات و اسم افراد که از دیکشنری بدست اومده نمایش داده بشه اما برام نوشتن اش سخته
آیا مایل به ارسال نوتیفیکیشن و اخبار از طرف راکت هستید ؟