由于我原来的帖子充满了火焰,假设我要求他们为我编写代码而拒绝回答我,我正在重新提问。
我强调我是Python的初级BEGINNER,我不是要求人们为我写的,我只是想确定方法和一些关于如何解决问题的指导,因为我很难接近它,所有人似乎都认为我要求他们给我所需的所有代码,而我不是。
那么,关于我原来的问题。
我的问题如下,我做了一个数学测验,将名称和分数输出到文本文件。在这个程序中,我计划在开头添加一些代码,它将运行一个选项列表来比较和排序文本文件中的结果。程序将条目导入到列表中,格式如下:
<'>''John:6','Bob:9','Billy:2','Matthew:7','Jimmy:2','Amy:9','Jenny:10','Michael:8 “]Python将此列表识别为8个项目,非常完美。它有自己的名字,然后是他们的分数。问题是我正在努力的规范要求我能够:
按字母顺序排列,每个学生的考试成绩最高。
此外,由最高分,最后由平均分。我已经尝试了很多个小时才能找到一些代码,可以将这些字符串中的整数相互比较以找到最高分,并且只打印那个,但我没有运气。我觉得我也会为其他两项任务而苦苦挣扎,并希望得到一些指导。我想过可能会使用切片将整数作为一个单独的值来比较它们,但是觉得这可能会使代码变得非常快。
答案 0 :(得分:1)
您可以尝试在“:”上拆分字符串,然后使用virtue
virtues
VIRTUE
VIRTUES
virtue's
VIRTUE'S
将数字转换为int。
然后可以将结果放在字典中:
int("2")
如果您已有商品(d = {}
d['John'] = 6
),则可以比较旧值和新值。
答案 1 :(得分:0)
将您的列表转换为元组,然后将很容易排序 sorting
from operator import itemgetter
st = [('John',6), ('Bob',9), ('Billy', 8), ('Matthew',7),
('Jimmy',2), ('Amy', 9), ('Jenny',10),('Michael',8)]
print(sorted(st, key=itemgetter(1),reverse=True))
[('Jenny', 10), ('Bob', 9), ('Amy', 9), ('Billy', 8), ('Michael', 8), ('Matthew', 7), ('John', 6), ('Jimmy', 2)]
答案 2 :(得分:0)
我建议使用字典而不是列表。字典通过配对键和值来工作。例如:
d = {}
d = {'key':'value'}
要转换列表,您可以使用:
作为要拆分的点来拆分键和值的字符串。例如:
test = ('John : 2')
print (test.split(" : "))
返回:
['John', '2']
将所有内容放在一起,这里有一个代码示例拉入您的列表并将其转换为字典然后按名称排序:
import operator
data = ['John : 6', 'Bob : 9', 'Billy : 2', 'Matthew : 7', 'Jimmy : 2', 'Amy : 9', 'Jenny : 10', 'Michael : 8']
new_data = {}
for i in range(len(data)):
split_data = data[i].split(" : ")
new_data[split_data[0]] = split_data[1]
new_data = sorted(new_data.items(), key=operator.itemgetter(0))
print (new_data)
答案 3 :(得分:0)
键/值字符串列表不是解决问题的适当数据结构,因为它需要字符串操作来提取值。您应该将数据解析为Dictionary或元组列表。
使用字典
d = {'John': 6, 'Bob': 9, 'Billy': 2,
'Matthew': 7, 'Jimmy': 2, 'Amy': 9,
'Jenny': 10, 'Michael': 8}
然后你可以做
# highest score
hs_name = max(d, key=d.get)
hs = d.get(hs_name)
output = "The winner is {} ({} Points)".format(hs_name, hs)
print(output)
字典在内存中没有订单,但您可以获得它们的排序表示:
# print ordered
import operator
sorted_d = sorted(d.items(), key=operator.itemgetter(1))
print(sorted_d)
如果要以有序方式在内存中存储字典,可以考虑使用OrderedDict。
您还可以考虑使用键/值对列表作为数据结构:
使用元组列表
lt = [('John', 6), ('Bob', 9), ('Billy', 2),
('Matthew', 7), ('Jimmy', 2), ('Amy', 9),
('Jenny', 10), ('Michael', 8)]
# print ordered
sorted_lt = sorted(lt, key=lambda x: x[1], reverse=True)
print(sorted_lt)
# highest score
hs_name = sorted_lt[0][0]
hs = sorted_lt[0][1]
output = "The winner is {} ({} Points)".format(hs_name, hs)
print(output)
我不知道你的具体要求是什么以及你想要排序的平均值(毕竟每个学生只有一个值),但这应该给你一个想法。
答案 4 :(得分:0)
这可能不是最诡计多端的方法(我在代码中留下了评论,我希望你理解,如果不是只是问):
#Your input list (changed so you can check your requirements when there's two scores for the same person)
input_list = ['John : 6', 'Bob : 10', 'Bob : 9', 'Billy : 2', 'Matthew : 7', 'Jimmy : 2', 'Amy: 9', 'Jenny : 10', 'Michael : 8']
#Transform into a List of tuples
scores = [(item.split(":")[0].strip(), item.split(":")[1].strip()) for item in input_list]
"""CASE 1 - Order alphabetically, and if there is 2 entries for the same person it should only print the highest of the entries for that student"""
print("Entering Case 1")
#create a dictionary with names and delete duplicates (save only the highest score for a given student)
dictionary_by_names = dict()
for item in scores:
if item[0] not in dictionary_by_names:
dictionary_by_names[item[0]] = item[1]
else:
dictionary_by_names[item[0]] = max(int(item[1]), int(dictionary_by_names[item[0]]))
#order by name (List of tuples)
list_by_names = sorted([(key,value) for key, value in dictionary_by_names.items()])
print(list_by_names)
"""CASE 2 - Order by score, taking their highest and ignoring other entries"""
print("Entering Case 2")
#invert dictionary_by_names, since we only want the highest score of a given duplicate
dictionary_by_scores = [(int(value), key) for key, value in dictionary_by_names.items()]
#Sort the list formed from the dictionary (cast the score to int so we can perform sort of int instead of string, because '10' < '2' (strings) and 10 > 2 (int))
list_by_score = sorted([(key,value) for key, value in dictionary_by_scores])
#Cast to string again so we can have it in the "original format"
list_by_score = [(str(item[0]), item[1]) for item in list_by_score]
#Invert tuples order so we can have it in the "original format"
list_by_score = [(item[1], item[0]) for item in list_by_score]
print(list_by_score)
"""CASE 3 - If more than one entry for the same student, calculate the average of their scores, and then order the average of each student high to low"""
print("Entering Case 3")
#create a dictionary with names and averages for students
dictionary_by_avg = dict()
for item in scores:
if item[0] not in dictionary_by_avg:
dictionary_by_avg[item[0]] = float(item[1])
else:
dictionary_by_avg[item[0]] = sum([float(item[1]), float(dictionary_by_avg[item[0]])])/2
list_by_avg = sorted([(value,key) for key, value in dictionary_by_avg.items()])
#Invert tuples order so we can have it in the "original format"
list_by_avg = [(item[1], item[0]) for item in list_by_avg]
print(list_by_avg)
输出:
Entering Case 1
[('Amy', '9'), ('Billy', '2'), ('Bob', 10), ('Jenny', '10'), ('Jimmy', '2'), ('John', '6'), ('Matthew', '7'), ('Michael', '8')]
Entering Case 2
[('Billy', '2'), ('Jimmy', '2'), ('John', '6'), ('Matthew', '7'), ('Michael', '8'), ('Amy', '9'), ('Bob', '10'), ('Jenny', '10')]
Entering Case 3
[('Billy', 2.0), ('Jimmy', 2.0), ('John', 6.0), ('Matthew', 7.0), ('Michael', 8.0), ('Amy', 9.0), ('Bob', 9.5), ('Jenny', 10.0)]
希望这是你想要实现的目标,下次细分你的问题并发布你尝试过的代码块我承认这个问题不是线性的,但是你可以完成它的一部分。
希望这有帮助。
BTW查看一些可以帮助您的文档:
我敢打赌,如果你已经阅读过它,你可以建立自己的解决方案。 :)