Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用python按字典值对文件进行排序_Python_Sorting_Dictionary - Fatal编程技术网

如何使用python按字典值对文件进行排序

如何使用python按字典值对文件进行排序,python,sorting,dictionary,Python,Sorting,Dictionary,字典数据(名称、平均分数)会提前收集并存储在文件中。然后,此代码重新打开文件并将其中的数据存储在变量(文件)中。我需要将文件中的数据按值排序,因此如果文件中的数据为: 詹姆斯:5 蒂姆:8 这将使蒂姆排在首位,因为他的平均得分更高。我该怎么做呢? 此外,字典也存在,以便在对集合进行排序时,名称和分数保持在一起 dict={} #假设每行的文件格式为“name:score”。 以open(“classa2.txt”、“r”)作为f: 对于f中的行: line=line.split(“:”) dic

字典数据(名称、平均分数)会提前收集并存储在文件中。然后,此代码重新打开文件并将其中的数据存储在变量(文件)中。我需要将文件中的数据按值排序,因此如果文件中的数据为: 詹姆斯:5 蒂姆:8 这将使蒂姆排在首位,因为他的平均得分更高。我该怎么做呢? 此外,字典也存在,以便在对集合进行排序时,名称和分数保持在一起 dict={} #假设每行的文件格式为“name:score”。 以open(“classa2.txt”、“r”)作为f: 对于f中的行: line=line.split(“:”) dict[行[0]]=行[1] #按值排序(分数) od=collections.OrderedDict(已排序(dict.items(),key=lambda t:t[1])) #写出新的结果 以open(“classa2.txt”,“w”)作为f: 对于输入od: f、 写入(键+':'+str(od[key])+“\n”) 打印键+“:”+str(od[键])
显然,数据文件如下所示

    file=sorted(file)
在这种情况下,你需要

tim: ["4.0", "2.9", "3.4"]
james: ["3.8", "3.8"]
clara: ["2.6", "3.5", "3.2"]
那你可以

from ast import literal_eval

def sort_key(line):
    # split "name: scores" into ["name", " scores"]
    name, score_str = line.split(":")

    # convert " [\"1.9\", \"3.8\"]" into ["1.9", "3.8"]
    scores = literal_eval(score_str.strip())

    # convert ["1.9", "3.8"] into [1.9, 3.8]
    scores = [float(f) for f in scores]

    # calculate average score
    avg = sum(scores) / len(scores)
    return avg
导致

# read data from file
with open("classa2.txt") as inf:
    lines = [line.rstrip() for line in inf]

# sort highest scores first
lines.sort(key=sort_key, reverse=True)

print("\n".join(lines))

如果您想对文件进行升序或降序排序,那么需要对字典做什么?不需要升序或降序,它需要按键排序。我用字典把名字和平均分数放在一起。当我使用一个列表时,所有的数据都被搞乱了,Uppyton的OrderedICT可能有用。查看示例:(参见通过值排序从dict创建OD的示例)感谢您提供的信息,但您甚至没有涉及我需要排序的文件中的数据。我想我解释错了。数据正在存储在文件中。然后我需要打开文件,从中获取数据并对其进行排序,然后将其打印到屏幕上。Sorry您的问题听起来好像您已经加载了词典,“词典数据(名称,平均分数)在问题代码中的较早部分收集”1秒后,我将更改问题,使其更有意义我认为我对我的答案进行了更改,符合您的要求。您的代码给出的错误列表索引超出了行位的范围。我的文件有几个条目我真的很抱歉,但是我更新了这个问题,因为我用错了词,你现在能帮我一下吗,因为这个问题稍微改变了一下。这会引发这个错误回溯(上次的最新调用):文件“C:/Users/James/Documents/python work/working/task 3 mably.py”,第28行,在lines.sort中(key=sort\u key,reverse=True)#排序得分最高的第一个文件“C:/Users/James/Documents/python work/working/task 3 mably.py”,第22行,在排序键中返回int(score)ValueError:int()无效,以10为底:“['4.0']”显然,您的文件行看起来不像
tim:5
,而是
tim:['4.0']
。相应地调整
排序键
。好的,但我是初学者,请您编辑答案中的代码,这样做,您的数据是正确的。顺便说一句,谢谢你的工作,请@hughbothwell,如果你能编辑这篇文章,让它工作起来,对像我这样的初学者真的很有帮助
james: ["3.8", "3.8"]
tim: ["4.0", "2.9", "3.4"]
clara: ["2.6", "3.5", "3.2"]