假設歌曲i
已播放f
我倍但齊普夫定律預言,它將 已播放z
我倍。然後你去網絡連接NE歌曲i
的質量要q
我 = f
我/z
我 。你的軟件應與q
我最高值選擇歌曲。Python代碼優化性能
輸入的第一個行包含兩個整數n
和m
(1 <= n < 50 000
,1 <= m <= n
),對專輯歌曲的數量,和歌曲選擇數字。然後按照n
行。所述i
「日這些線包含一個整數f
我和串s
我,其中0 <= f
我< 10^12
是次數i
」個歌曲被收聽,和s
我是名稱這首歌。 每首歌曲名稱長度不超過30個字符,僅由字符a-z
,0-9
和下劃線(_
)組成。
以質量遞減的順序輸出最高質量的m首歌曲的列表q
i。如果兩首歌曲具有相同的質量,優先考慮專輯中第一首出現的歌曲(推測製片人有理由將該歌曲放在另一首歌曲之前)。
sample input
4 2
30 one
30 two
15 three
25 four
sample output
four
two
我很新的蟒蛇,我試圖解決這個難題,我認爲我得到正確的答案,但我必須做得更快,任何建議?
from __future__ import division
def main():
import sys
from operator import itemgetter
data = sys.stdin.readlines()
line1 = data[0].split(" ")
numberofselect = line1[1]
qualitydict = {};
songdict = {};
a = 0
for x in range(1, len(data)):
item = data[x].split(" ");
item1 = item[1].split("\n");
f = float(item[0])
z = float(1/x)
qualitydict[item1[0]] = (f/z)
if ((f/z) in songdict.keys()):
songdict[(f/z)].append(item1[0])
else:
songdict[(f/z)] = [item1[0]]
items = songdict.items()
items.sort(key = itemgetter(0), reverse=True)
for key, value in items:
for element in value:
if (a < int(numberofselect)):
print element
a = a + 1
main();
邊注:從編程挑戰摘自:https://www.scrool.se/static/documents /spotify-job-site.pdf – miku
我鼓勵你[*嘗試這種方法*](http://stackoverflow.com/a/4299378/23771)找出哪部分代碼花費最多的時間。 –
通過'from __future__ import division'導入,您不需要通過'float'投射。做'fz = f/z'並替換所有'f/z'。 – Developer