2017-06-20 26 views
-1

我有以下問題:我做參數測試,併爲每個參數組合創建一個新對象,該對象由其他參數創建的下一個對象替換。該對象具有屬性jaccard係數和屬性ID。在每一步我想存儲對象的jaccard係數。最後,我想要十大jaccard coeefcient和他們相應的ID。Python:存儲前十個數字的最佳方法

r=["%.2f" % r for r in np.arange(3,5,1)] 
fs=["%.2f" % fs for fs in np.arange(2,5,1)] 
co=["%.2f" % co for co in np.arange(1,5,1)] 
frc_networks=[] 

bestJC = [] 
bestPercent = [] 
best10Candidates = [] 
count = 0 
for parameters in itertools.product(r,fs,co): 

    args = parser.parse_args(["path1.csv","path2.csv","--r",parameters[0],"--fs",parameters[1],"--co",parameters[2]]) 

    if not os.path.isfile('FCR_Network_Coordinates_ID_{}_r_{}_x_{}_y_{}_z_{}_fcr_{}_co_{}_1.csv'.format(count, args.r, args.x, args.y, args.z, args.fs,args.co)): 

     FRC_Network(count,args.p[0],args.p[1],args.x,args.y,args.z,args.r,args.fs,args.co) 

屬性可以通過FRC_Network.ID和FRC_Network.JC

+0

我缺少的東西要麼就乾脆列表進行排序,然後第一後斬去什麼十個要素是否有訣竅? (注意:這是對數更多的工作比絕對必要的,但我敢肯定你可以負擔得起。) – 5gon12eder

+0

是的,我可以排序jaccard coeeficient列表和砍掉它,但我需要的索引獲得相應的ID在IDS列表。 – Varlor

+0

我不打算保留整個列表。我會使用['heapq.heappushpop()'](https://docs.python.org/2/library/heapq.html#heapq.heappushpop)來維持'for'循環迭代的十個最大值。這樣,從來沒有一個值得擔心的巨大名單。 –

回答

1

叫我想我會用heapq.heappushpop()這一點。這樣,無論您的輸入集有多大,您的數據要求都被限制爲10個元組列表。

請注意使用元組來保留JCID參數。由於比較是詞典編纂,因此總是按JC排序。

另外請注意,最後致電.sort()是可選的。如果你只想要十個最好的,就跳過這個電話。如果你想要十個最好的,保持電話。

import heapq 

#UNTESTED 
best = [] 
for parameters in itertools.product(r,fs,co): 
    # ... 
    if len(best) < 10: 
     heapq.heappush(best, (FRC_Network.JC, FRC_Network.ID)) 
    else: 
     heapq.heappushpop(best, (FRC_Network.JC, FRC_Network.ID)) 
best.sort(reverse=True) 

下面是一個測試版,演示概念:

import heapq 
import random 
from pprint import pprint 

best = [] 
for ID in 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ': 
    JC = random.randint(0, 100) 
    if len(best) < 10: 
     heapq.heappush(best, (JC, ID)) 
    else: 
     heapq.heappushpop(best, (JC, ID)) 
pprint(best) 

結果:

[(81, 'E'), 
(82, 'd'), 
(83, 'G'), 
(92, 'i'), 
(95, 'Z'), 
(100, 'p'), 
(89, 'q'), 
(98, 'a'), 
(96, 'z'), 
(97, 'O')] 
+0

不錯,我會測試它:) – Varlor