2015-04-03 78 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))])