2011-02-05 82 views
1

我具有由出元組的列表,例如下面的一個:具有不同值的SETT在字典中的水平鍵有效的比較

(2809.3994479562093, 1032.5989696312365, 0.0), {'level': '2', 'id': '1'}) 

(增加,但不總是整數,即1,2,3,3B,4A,5,5A,6,7),該id遞增地增加並且僅由整數組成。

我試圖找出的是元組的第一個元素的前兩個值的值,即浮點數2809.399 ...和1032.5989 ...在級別爲+/- 1與我目前的不同。 換句話說,2級ID 1應該在1級可以找ID 1和3

我想出這個如下:

for x in xrange(len(net.lifts)): 
    if net.lifts[x][1]["level"] == "2": 
     for y in xrange(len(net.lifts)): 
      if (net.lifts[y][1]["level"] == "1" or net.lifts[y][1]["level"] == "3") and net.lifts[y][1]["id"] == net.lifts[x][1]["id"]: 
       print "edge:" + str(net.lifts[x][0][:2]) + str(net.lifts[y][0][:2]) 

和它的作品。然而,它要求我爲每個案例定義long if語句。 有沒有一個更有效的方法(算法)抽象這個,而不必創建7如果循環(每個級別一個)?

回答

2

有兩點需要注意:

  1. 你不寫在Python for i in range(len(xs)): # use xs[i],就像你不寫在C int i = 0; while (i < N) { /* use xs[i]; */ i++; }你寫for x in xs: # use x
  2. 考慮使用named tuple作爲值的描述性名稱。也考慮重組數據。例如,你可以使用像{ level_1: { id_1: (val_1, val_2), id_2: ...}, level_2: ...}這樣的格式。

至於實際問題:即使使用當前格式,也可以推廣它(請注意,代碼假設這些級別是整數 - 我知道它們不是,但我不知道如何從一個級別到系統中的下一個)。

for lift in net.lifts: 
    for other_lift in net.lifts: 
     if (lift[1]['id'] == other_lift[1]['id'] and 
      abs(lift[1]['level'] - other_lift[1]['level']) <= 1): 
      # got one 

會更容易(更快,複雜性,明智的 - 這是目前O(n**2))更深思熟慮的數據結構。

+0

非常好的提示。謝謝。這兩個水平的差別需要嚴格等於1而不是更小(這意味着升降機都在同一水平上) – user228137 2011-02-06 14:29:53

1

您應該重構您的數據。它目前的格式不利於你試圖解決的問題,因爲它是按順序形式的,而且你正在有效地嘗試像字典中那樣進行隨機訪問。

重新整理成一本字典:

'level': 
    'id': 
     (data) 

有什麼它的意思是「+/- 1從你的水平目前處於」如果你的水平是不是在你需要定義的另一個問題整數。也就是說,從3說一級是什麼? 3B4A4B,...?爲了解決這個問題,你可能想重新定義你的級別爲整數,並存儲從字符串名稱到整數值的映射。整數是在存儲水平的良好數據類型