محمدرضا هلالی
3 سال پیش توسط محمدرضا هلالی مطرح شد
2 پاسخ

گرفتن ماکزیمم کلیدهای دیکشنری

سلام من دارم روی یک پروژه کار میکنم که اطلاعات از 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 لیست بسازم و پرینت بگیرم اما قشنگ گیج شدم یکی کمک کنه واقعا دو هفته درگیر این فانکشن هستم :(


ثبت پرسش جدید
Amir Aref
تخصص : برنامه نویس
@AmirAref 3 سال پیش مطرح شد
0

سلام
دوست عزیز شما خیلی مبحث رو پیچیده کردید ، در واقع نیاز به هیچ کتابخانه و ماژول مجزایی برای انجام این کار نیست
تابع ()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")    

محمدرضا هلالی
تخصص : جونیور تازه کار
@mohammadrezah 3 سال پیش آپدیت شد
0

سلام ببخشید بابت تاخیر من برنامه نوشتم اما مشکلی که داره اسامی هر بار آپدیت نمیکنه و روی فرد اول میمونه الان باید چیکار کنم این کدی هم که شما گذاشته بودید از 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 اعداد بزرگ بدست بیاد و در نهایت توی یک حلقه دیگه نمرات و اسم افراد که از دیکشنری بدست اومده نمایش داده بشه اما برام نوشتن اش سخته


برای ارسال پاسخ لازم است وارد شده یا ثبت‌نام کنید

ورود یا ثبت‌نام