按字母顺序对列表进行排序,同时保持以前的索引

时间:2015-04-03 21:10:56

标签: python sorting

我有一个个人项目,其中我有一个名称列表和3个与某个名称相对应的分数。但是,我想按照字母顺序“排序”这个列表,同时保持以前的索引,以便我可以链接得分。 我想要实现的是能够按照字母顺序对此列表进行排序,并打印与名称相对应的分数,我不知道如何使这更简洁和更有信息。

以下是我的一些代码:

Names = ['Fred', 'John', 'Sally']
Scores = [1,5,9,2,4,6,3,6,5]
for i in range(0, len(Names)):
    print("The score(s) for", Names[i], "is:", Scores[i], Scores[i+3], Scores[i+6])`

因此,例如,我对此程序的首选结果(如果已排序)将为:

  

John的得分是:5,4,6   等...

7 个答案:

答案 0 :(得分:1)

如果你假设每个名字都是独一无二的,这可能会非常快。您只需要使用未排序列表中的索引。

names = ['Fred', 'John', 'Sally', 'Alex']
scores = [1,5,9,7, 2,4,6,8, 3,6,5,9]

l = len(names)
for e in sorted(names):
    i = names.index(e) # index in unsorted list
    print "The score for", e, "is:", scores[i], scores[i+l], scores[i+2*l]

答案 1 :(得分:0)

一堆任意list s是这里使用的错误数据结构。使用用户姓名的密钥和分数列表的值创建字典。如果您必须从给定的NamesScores开始,请执行以下操作:

>>> Names=['Fred', 'John', 'Sally']
>>> Scores=[1,5,9,2,4,6,3,6,5]
>>> Scores = [Scores[i:i+3] for i in range(0, len(Scores), 3)]
>>> all_scores = {k:v for k,v in zip(Names, Scores)}
>>> all_scores
{'Sally': [3, 6, 5], 'John': [2, 4, 6], 'Fred': [1, 5, 9]}

现在,您可以sortprint加入该词典。

答案 2 :(得分:0)

首先重新排列数据模型,如下所示:

Names = ['Fred', 'John', 'Sally']
Scores = [1,5,9,2,4,6,3,6,5]

data = {}
for index, name in enumerate(Names):
    data[name] = [Scores[(index * 3)], Scores[(index * 3) + 1], Scores[(index * 3) + 2]]

现在data包含:

{'John': [2, 4, 6], 'Sally': [3, 6, 5], 'Fred': [1, 5, 9]}

现在你可以做任何你想做的事。要按照有条理的方式打印姓名和分数,您可以:

for name in sorted(data.keys()):
    print name, date[name]

答案 3 :(得分:0)

看起来你应该制作一个新的索引列表,然后对这个新列表进行排序。

ordered_name_list = range(len(names))
ordered_name_list.sort(key=lambda item: name[item])

然后,使用该有序名称列表选择每个名称和每个偏移到Scores。您的列表访问也非常简单。

for o in ordered_name_list:
    print("The scores for {0} are {1}".format(names[o], ", ".join(Scores[o::3])))

答案 4 :(得分:0)

由于种种原因,此代码非常非pythonic。

首先,只是一件小事,你不想使用range(len())。请改为使用枚举:for i, val in enumerate(Names):,这样您就可以获得索引和值。

现在你的实际问题。你不应该将这些值存储在两个单独的列表中。这正是字典的用法:

scores={"Fred": [1, 2, 3], "John": [5, 4, 6], "Sally": [9, 6, 5]}

当然,字典无法排序,因为它们没有订单,所以你必须使用OrderedDicts。这些是保持秩序的字典。

所以这就是你应该做的事情:

from collections import OrderedDict

scores={"Fred": [1, 2, 3], "John": [5, 4, 6], "Sally": [9, 6, 5]}
scores=OrderedDict(sorted(scores.items(), key=lambda t: t[0]))

瞧!打印出来:

for name, score in scores.items():
    print("The scores for {0} are {1}, {2}, and {3}.".format(name, *score))

答案 5 :(得分:0)

除了改变你的昵称,我建议:

# rearrange into a list of tuples with (name, [scores]) structure
data = [(name, Scores[idx*3:idx*3+3]) for (idx,name) in enumerate(Names)]

# then sort alphabetically on name
import operator
data = sorted(data, key=operator.itemgetter(0))

答案 6 :(得分:0)

scores = [Scores[i:i+3] for i in range(0, len(Scores), 3)]
print sorted([(name, all_scores) for name, all_scores in zip(Names, zip(*scores))])