当值是大浮点数时按值对字典进行排序(尝试了 lambda 和 itemgetter,但没有得到正确的结果)



我有一个csv文件,里面有人名和平均数如下:

mandana,7.5
hamid,6.066666666666666
sina,11.285714285714286
sara,9.75
soheila,7.833333333333333
ali,5.0
sarvin,11.375

我想按平均值排序并将其写入另一个文件。我试过lambda和itemgetter,但我没有得到正确的结果。下面是我的代码:

def calculate_sorted_averages(file1, file2):
with open (r'C:UserssonyDesktopPython with Jadifile1.csv', 'r') as f1:
reader=csv.reader(f1)
d={}
for row in reader:
name=row[0]
average=row[1]
d[name]=average
sorted_dict=OrderedDict(sorted(d.items(), key=operator.itemgetter(1), reverse=True))
with open (r'C:UserssonyDesktopPython with Jadifile2.csv', 'w', newline='') as f2:
for key in sorted_dict.keys():
writer=csv.writer(f2)
writer.writerow([key,sorted_dict[key]])

下面是我的输出:

sara,9.75
soheila,7.833333333333333
mandana,7.5
hamid,6.066666666666666
ali,5.0
sarvin,11.375
sina,11.285714285714286

可以看到它没有排序。我也试过了,但没有用。我现在很沮丧,不知道该怎么办。有人能帮我吗?谢谢。

您得到了您的结果,因为您按字典顺序排序(将您的浮点数作为字符串进行比较),而不是按其数值排序。

你所缺少的就是将数值转换为float,然后你就完成了,然后像往常一样使用key=operator.itemgetter(1)进行排序

def calculate_sorted_averages(file1, file2):
d = {}
with open (r'path/to/unsorted.csv', 'r') as f1:
reader=csv.reader(f1)
for row in reader:
name=row[0]
average=row[1]
d[name]=float(average)
sorted_dict=OrderedDict(sorted(d.items(), key=operator.itemgetter(1), reverse=True))
with open (r'path/to/sorted.csv', 'w', newline='') as f2:
for key in sorted_dict.keys():
writer=csv.writer(f2)
writer.writerow([key,sorted_dict[key]])
aaa = {'0': ['mandana', 7.5], '1': ['hamid', 6.066666666666666], '2': ['sina', 11.285714285714286], '3': ['sara', 9.75],
'4': ['soheila', 7.833333333333333], '5': ['ali', 5.0], '6': ['sarvin', 11.375]}
sorted_ = sorted(aaa.items(), key=lambda x: x[1][1])
sorted_ = dict(sorted_)

输出
{'5': ['ali', 5.0], '1': ['hamid', 6.066666666666666], '0': ['mandana', 7.5], '4': ['soheila', 7.833333333333333], '3': ['sara', 9.75], '2': ['sina', 11.285714285714286], '6': ['sarvin', 11.375]}

你没有显示包含键的整个字典。所以我创建了"aaa"。按第二个元素排序。

默认情况下,从文件中读取的文本,无论是否有csv.reader,都存储为字符串。您需要在每行的第二个元素上调用float,以将其解释为浮点数。

我认为在这里使用OrderedDict有点过头了。调用sorted一次就足够了。

import csv
def calculate_sorted_averages(filename_input, filename_output):
with open(filename_input, 'r') as f1:
reader=csv.reader(f1)
sorted_rows = sorted(reader, key=lambda x: float(x[1]))
with open(filename_output, 'w') as f2:
writer = csv.writer(f2)
writer.writerows(sorted_rows)
calculate_sorted_averages('file1.csv', 'file2.csv')

结果:

$ cat file1.csv 
mandana,7.5
hamid,6.066666666666666
sina,11.285714285714286
sara,9.75
soheila,7.833333333333333
ali,5.0
sarvin,11.375
$ cat file2.csv
ali,5.0
hamid,6.066666666666666
mandana,7.5
soheila,7.833333333333333
sara,9.75
sina,11.285714285714286
sarvin,11.375

您可以尝试pandas模块。

pandas.read_csv()函数将读取csv文件的路径,并将其转换为pandas数据帧,或者更简单地说,它将在Python中显示一个表。

import pandas as pd
df = pd.read_csv("C:UserssonyDesktopPython with Jadifile1.csv")
df.columns = ["Name", "Value"]    # To set the column names. Only do this if the dataframe doesn't already have a column name.
sorted_df = df.sort_values(by = "Value")    # Sorting the dataframe by the values in the "Value" column

输出——

6.0666666666666mandana7.57.83333333333339.7511.285714285714286sarvin11.375

Pandas可以用于此—您可以使用pip install pandas安装它

import pandas as pd
df = pd.read_csv('filename.csv')
df.columns = ['name', 'value']
df.sort_values('value', inplace=True, ascending=True)
print(df)

最新更新