Python将两个列表排序在一起?

时间:2019-03-11 19:13:42

标签: python python-3.x list sorting

我的以下代码存在一些问题。我有两个清单名称和分数。这些列表相互对应,如下所示。我的目标是打印出两个列表中最重要的前三个项目。我试图将它们从最大到最小排序,然后打印出前三个项目,但是我遇到了一些错误。有什么想法吗?谢谢。

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

8 个答案:

答案 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则表示降序。