2015-04-03 55 views
0

我有一个个人项目,其中我有一个名称和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])` 

因此,例如,我的这个程序优选结果,分类时,将是:

为约翰的得分(s)为:5,4,6 等...

+0

这是没有SENCE给我,加上我不知道Python,但你为什么不使用对象或某种结构(你猜它们存在于python中)你可以有一个字符串和一个int数组,并将它们一起使用 – 2015-04-03 21:19:24

+0

如果你将每个人及其相关分数存储在一个字典中,那会更好。如: {“John”:[2,4,6]} – Udy 2015-04-03 21:19:26

+1

这是您的GCSE考试课程吗? – DNA 2015-04-03 21:19:35

回答

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那本字典是你喜欢的。

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] 
0

看起来你应该做一个新的索引列表,并对新列表进行排序。

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

然后,使用那个有序名称列表来挑选每个名称和每个偏移量到分数中。您的列表访问也是非常不错的。

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

此代码是非常,Python的原因是多方面的。

首先,只是一个小事情,你不想永远使用range(len())。使用枚举代替:for i, val in enumerate(Names):,因此您将同时获得索引和值。

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

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

当然,词典不能进行排序,因为他们没有秩序,所以你必须给UE 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)) 
+0

字典无法排序,但可以使用'sorted(my_dictionary)'以迭代方式迭代。 – TigerhawkT3 2015-04-03 21:29:05

+0

@ TigerhawkT3真的,但这正是OrderedDicts的原因。查看OrderedDicts的文档。他们给出的第一个例子是关于排序字典。 – Maltysen 2015-04-03 21:31:12

+0

我只是不希望人们认为他们在任何时候想按照某种排序顺序打印字典时都必须使用OrderedDict。 – TigerhawkT3 2015-04-03 21:39:34

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] 
+0

我向你们推荐我的Python-er,我不知道这个任务可以轻松解决;你在这种情况下为我的程序提供了最有效的答案,我感谢你! – Pythonner 2015-04-03 21:41:10

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)) 
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))])