我的以下代码存在一些问题。我有两个清单名称和分数。这些列表相互对应,如下所示。我的目标是打印出两个列表中最重要的前三个项目。我试图将它们从最大到最小排序,然后打印出前三个项目,但是我遇到了一些错误。有什么想法吗?谢谢。
names = ['Xander', 'Spec', 'Meng', 'Sparc', 'Jones', 'Nick', 'Link']
scores = [120, 450, 300, 200, 66, 183, 80]
scores, names = (list(t) for t in zip(*sorted(zip(scores, names))))
print(names[:3] + " " + scores[:3])
示例输出:
Spec 450
Meng 300
Sparc 200
答案 0 :(得分:2)
您的代码唯一的问题是打印部分(您必须反转排序):
scores, names = (list(t) for t in zip(*sorted(zip(scores, names), reverse=True)))
for name, score, _i in zip(scores, names, range(3)):
print(name, score)
# 450 Spec
# 300 Meng
# 200 Sparc
我建议您使用collections.Counter
:
from collections import Counter
names = ['Xander', 'Spec', 'Meng', 'Sparc', 'Jones', 'Nick', 'Link']
scores = [120, 450, 300, 200, 66, 183, 80]
counter = Counter({name: score for name, score in zip(names, scores)})
print(counter.most_common(3))
# [('Spec', 450), ('Meng', 300), ('Sparc', 200)]
然后您可以按照自己喜欢的方式格式化结果。
答案 1 :(得分:2)
您可以使用heapq.nlargest
:
from heapq import nlargest
for score, name in nlargest(3, zip(scores, names)):
print(name, score)
这将输出:
Spec 450
Meng 300
Sparc 200
答案 2 :(得分:0)
如果您的问题出在印刷部分:
for i in range(3):
print(names[i], scores[i])
答案 3 :(得分:0)
您在最后一行中的打印错误。您不能像这样将list
对象与str
并置。而是这样做:
scores, names = (list(t) for t in zip(*sorted(zip(scores, names), reverse=True)))
for i in range(3):
print(names[i], scores[i])
注意:reverse=True
用于对列表进行反向排序(DESC)。
答案 4 :(得分:0)
您似乎要在打印语句中连接两个列表和一个字符串。 DanielMöller的答案是正确的。另外,您可能需要将True
传递给reverse=
关键字参数,否则将获得最小的三个:
names = ['Xander', 'Spec', 'Meng', 'Sparc', 'Jones', 'Nick', 'Link']
scores = [120, 450, 300, 200, 66, 183, 80]
scores, names = (list(t) for t in zip(*sorted(zip(scores, names), reverse=True)))
for i in range(3):
print(names[i], scores[i])
Spec 450
Meng 300
Sparc 200
答案 5 :(得分:0)
这是解决方法
names = ['Xander', 'Spec', 'Meng', 'Sparc', 'Jones', 'Nick', 'Link']
scores = [120, 450, 300, 200, 66, 183, 80]
data = list(zip(names, scores))
print(data)
# output [('Xander', 120), ('Spec', 450), ('Meng', 300), ('Sparc', 200), ('Jones', 66), ('Nick', 183), ('Link', 80)]
data.sort(key=lambda x:x[1], reverse=True)
print(data)
# output [('Spec', 450), ('Meng', 300), ('Sparc', 200), ('Nick', 183), ('Xander', 120), ('Link', 80), ('Jones', 66)]
for name, score in data:
print(name,score,sep='\t')
""" output
Spec 450
Meng 300
Sparc 200
Nick 183
Xander 120
Link 80
Jones 66
"""
如更改所建议的那样,可以用这种更优雅的方式完成。
names = ['Xander', 'Spec', 'Meng', 'Sparc', 'Jones', 'Nick', 'Link']
scores = [120, 450, 300, 200, 66, 183, 80]
data = list(zip(scores, names))
print(data)
# output [(120, 'Xander'), (450, 'Spec'), (300, 'Meng'), (200, 'Sparc'), (66, 'Jones'), (183, 'Nick'), (80, 'Link')]
data.sort(reverse=True)
print(data)
# output [(450, 'Spec'), (300, 'Meng'), (200, 'Sparc'), (183, 'Nick'), (120, 'Xander'), (80, 'Link'), (66, 'Jones')]
for score, name in data:
print(name,score,sep='\t')
""" output
Spec 450
Meng 300
Sparc 200
Nick 183
Xander 120
Link 80
Jones 66
"""
使用@Jab建议的itemgetter
names = ['Xander', 'Spec', 'Meng', 'Sparc', 'Jones', 'Nick', 'Link']
scores = [120, 450, 300, 200, 66, 183, 80]
data = list(zip(names, scores))
print(data)
# output [('Xander', 120), ('Spec', 450), ('Meng', 300), ('Sparc', 200), ('Jones', 66), ('Nick', 183), ('Link', 80)]
from operator import itemgetter
data.sort(key=itemgetter(1), reverse=True)
print(data)
# output [('Spec', 450), ('Meng', 300), ('Sparc', 200), ('Nick', 183), ('Xander', 120), ('Link', 80), ('Jones', 66)]
for name, score in data:
print(name,score,sep='\t')
""" output
Spec 450
Meng 300
Sparc 200
Nick 183
Xander 120
Link 80
Jones 66
"""
答案 6 :(得分:0)
您可以使用operator.itemgetter
对数据进行压缩和排序,然后像这样打印数据:
from operator import itemgetter
names = ['Xander', 'Spec', 'Meng', 'Sparc', 'Jones', 'Nick', 'Link']
scores = [120, 450, 300, 200, 66, 183, 80]
data = sorted(zip(names, scores), key=itemgetter(1), reverse=True)
for name, score in data[:3]:
print(f"{name}: {score}")
这将输出:
Spec: 450
Meng: 300
Sparc: 200
答案 7 :(得分:0)
如果names
是唯一的,我建议按以下方式使用dict
:
names = ['Xander', 'Spec', 'Meng', 'Sparc', 'Jones', 'Nick', 'Link']
scores = [120, 450, 300, 200, 66, 183, 80]
high = sorted([i for i in d.items()],key=lambda x:x[1],reverse=True)[:3]
for i in high:
print(i[0],i[1])
输出:
Spec 450
Meng 300
Sparc 200
key
中的 sorted
用于指出应按值排序(第二个,因为索引从0开始),而reverse
则表示降序。