Представьте, что у нас есть словарь имен людей и средних значений, отсортированных по значению (среднему) в порядке убывания. Я хочу отсортировать словарь таким образом, чтобы люди с одинаковыми средними значениями отображались в алфавитном порядке. Например:
Ayda,19
Alex,18
Jack,17
George,17
Robbie,15
Я хочу получить этот вывод:
Ayda,19
Alex,18
George,17
Jack,17
Robbie,15
Я хочу изменить следующий код:
def calculate_sorted_averages(file1, file2):
with open (r'C:\Users\sony\Desktop\Python with Jadi\file1.csv', 'r') as f1:
reader=csv.reader(f1)
d={}
for row in reader:
name=row[0]
average=float(row[1])
d[name]=average
sorted_dict=dict(sorted(d.items(), key=operator.itemgetter(1), reverse=False))
with open (r'C:\Users\sony\Desktop\Python with Jadi\file2.csv', 'w', newline='') as f2:
for key in sorted_dict.keys():
writer=csv.writer(f2)
writer.writerow([key,sorted_dict[key]])
Я думаю, что сортировка части словаря будет полезна, но я не знаю, как разделить словарь, отсортировать его по алфавиту, а затем снова объединить. Помогите, пожалуйста, разобраться?
Я бы предложил Сортировать в обратном порядке average
для убывания (так что -1 * n
), а затем name
для алфавитного порядка. Например:
names_strng = """
Ayda,19
Alex,18
Jack,17
George,17
Robbie,15
"""
my_dct = dict(s.split(',') for s in names_strng.strip().split('\n'))
print(my_dct)
my_dct_srted = dict(sorted(my_dct.items(), key=lambda pare: (-float(pare[1]), pare[0])))
print(my_dct_srted)
Из:
{'Ayda': '19', 'Alex': '18', 'Jack': '17', 'George': '17', 'Robbie': '15'}
{'Ayda': '19', 'Alex': '18', 'George': '17', 'Jack': '17', 'Robbie': '15'}
Я нашел проблему. Так как мои числа были числами с плавающей запятой, в этом случае мне пришлось использовать "float" вместо "int" перед парой [1]. (т. е. float(pare [1])). Большое спасибо за твою помощь!
Ах да, я думаю, что, возможно, это было так. Я также обновлю свой ответ, чтобы уточнить, что это действительно так.
Спасибо за вашу помощь, но когда я использую этот код, он сортирует весь словарь по алфавиту, а я хочу отсортировать только людей с похожими средними значениями в алфавитном порядке. mandana,7.5 alex,7.5 hamid,6.066666666666666 sina,11.285714285714286 sara,9.75 soheila,7.833333333333333 ali,5.0 sarvin,11.375 your code will give this output: ali,5.0 hamid,6.066666666666666 alex,7.5 mandana,7.5 soheila,7.833333333333333 sara,9.75 sarvin ,11.375 sina,11.285714285714286 но я хочу "sina" перед "sarvin". Что я должен делать?