我不知道如何标题,所以也欢迎对标题提出建议。 我正在创建一个程序,它将从文件中读取数据并按顺序打印。
该文件将始终包含基于此的数据:
这是我从文件中获取数据的代码:
def getData(file):
data = {}
try:
with open(file + ".txt", "r") as file:
for line in file:
build = line.split(":")
data[build[0]] = build[1]
except FileNotFoundError:
with open(file + ".txt", "a") as file:
pass
return data
返回的数据是:
data = {"Name": "1,2,3\n", "Name_2": "4,5,6\n", "Name_3": "10,9,8\n"
现在我已经获得了数据,我正在尝试“排序”它,字典不是真的可以排序,所以我使用了“OrderedDict”。下面是代码:
def sortData(data, choice):
## Sort By Average
if choice == "Average":
for name, score in data.items():
amount = 0
for i in re.finditer("[0-9]{1,2}", score):
amount += 1
average = eval(re.sub(",","+",score))/amount
data[name] = str(average) + "\n"
od_data = collections.OrderedDict(sorted(data.items(), key=lambda t:float(t[1]), reverse=True))
for name, score in od_data.items():
sys.stdout.write("%s: %s" % (name, score))
## Sort By Highest - Lowest
elif choice == "Highest - Lowest":
od_data = collections.OrderedDict(sorted(data.items(), key=lambda t:t[1], reverse=True))
for name, score in od_data.items:
sys.stdout.write("%s: %s" % (name, score)
当选择为“平均”时,数据按照预期和按顺序打印。当选择“最高 - 最低”时,数据将按顺序打印出来:
它应该工作,只有当第一个“数字”不是“10”时,由于某种原因它似乎在程序中注册为“1”和“0”,因此最终成为最低的条目。
答案 0 :(得分:0)
不是使用re
和eval
,而是split
和,
到map
(或{{} int
字符串。 1}}),可以在加载文件时直接使用。然后其余部分变得更加容易。
float
在你的第二部分中,对于>>> data = {"Name": "1,2,3\n", "Name_2": "4,5,6\n", "Name_3": "10,9,8\n"}
>>> data = {k: [int(x) for x in v.split(',')] for k, v in data.items()}
>>> collections.OrderedDict(sorted(data.items(), key=lambda item: sum(item[1]) / len(item[1]), reverse=True))
OrderedDict([('Name_3', [10, 9, 8]), ('Name_2', [4, 5, 6]), ('Name', [1, 2, 3])])
,并不完全清楚你想要如何排序。如果你想按照它们的自然顺序对列表进行排序 - 比较是第一个元素,如果它们等于第二个,依此类推 - 然后排序(data.items(),key = lambda t:t [ 1],reverse = True)choice == "Highest - Lowest"
t [1] in itself is correct, but
data`仍然是一个字符串,所以你只是按字符串的字典顺序排序。您必须首先转换为整数列表,如上所述。
如果您希望按这些列表的最小元素排序,可以尝试:
from
另请注意,您根本不需要将排序结果包装到>>> collections.OrderedDict(sorted(data.items(), key=lambda item: min(item[1]))) # or max for maximum
中,因为您只需迭代项目。只需直接使用OrderedDict
的结果即可。另外,我建议在调用函数之前将数据更改为整个列表。总而言之,您可以将代码更改为以下内容:
sorted
答案 1 :(得分:0)
问题在于程序不会根据所有值对它们进行排序。我对@tobias_k使用了一个建议,非常有用,并用它实现了另一个代码:
最终代码:
data = {k: [int(x) for x in v.split(',')] for k, v in data.items()}
od_data = collections.OrderedDict(sorted(data.items(), key=operator.itemgetter(1), reverse=True))
print(od_data)
现在打印:
OrderedDict([(&#39; Jeff&#39;,[10,10,10]),(&#39; Max&#39;,[9,0]),(&#39; How&#39 ;,[6,2,3]),(&#39; What&#39;,[6,1]),(&#39; Jefferson&#39;,[6]),(&#39; Henry&# 39;,[5,5,5]),(&#39;为什么&#39;,[5,5,4]),(&#39; Harry&#39;,[5,4])])< / p>
(我添加了几个例子来正确测试它。)