2013-01-02 85 views
0

我有一組四元組('myTup')和一個元組('tupleToSearch')。我需要搜索這個元組的所有實例到每個四元組中。 'tupleToSearch'將與每個四元組的前兩個元素進行比較,如果匹配,則會報告匹配四元組的最後兩個元素。Python中的四元搜索元組

我正在使用下面的代碼來做同樣的事情。

myTup = set([('0994900', '50.2297', 'name1', '<4'), 
      ('2176041', '24.2880', 'name2', 'POSITIVE'), 
      ('2240663', '51.2510', 'name3', '25.0'), 
      ('2240663', '51.2510', 'name4', '29.0'), 
      ('2240663', '51.2560', 'name4', '29.0')]) 

tupToSearch = ('2240663', '51.2510') 


[(x[2],x[3]) for x in myTup if tupToSearch == (x[0],x[1])] 

我需要擴展此代碼,以便不是精確搜索,而是執行範圍比較。

例如,給定tupleToSearch = ('2240663', '51.2510'),我想找到那些第二個元素大於等於51.2510但小於(51.2510 +偏移量)的四元組。這裏'抵消'是一個常數。

在上述情況下的正確答案將會報告最後三個四元組(僅來自這兩個元素的最後兩個元素)。

如何將第二個元素轉換爲數值以進行正確比較。

此外,我需要一個有效的方法來做到這一點,因爲我需要重複這一步近10億次。

+1

到底在哪沒有'51.27'從何而來? – NPE

+0

我在第二學期添加了一個常數 – learner

+0

@NPE,我編輯了原文。我正在爲第二個元素添加一個'偏移量'。這個偏移量是不變的 – learner

回答

0

過濾掉你想要的元素,然後拉出每個元素的塊來創建你的結果。

[(el[2], float(el[3])) for el in itertools.ifilter(lambda oel: oel[0] == search_tup[0] and float(search_tup[1]) <= float(oel[1]) <= float(search_tup[1]) + offset, my_tup)] 

或者,做整個事情在單次與發電機(注意,發電機,不像列表比較,將正常處理情況el[3]不能變相爲float)。

def filtered_data(input, search_target, offset): 
    key = search_target[0] 
    value = float(search_target[1]) 
    for entry in input: 
     entry_value = float(entry[1]) 
     if entry[0] == key and entry_value <= value <= entry_value + offset: 
      try: 
       result_value = float(entry[3]) 
      except ValueError: 
       result_value = entry[3] 
      yield (entry[2], result_value) 

[filtered_data(my_tup, search_tup, .019)] 

注意,因爲你在這裏使用浮點值,你的過濾過程總是會受到推出無誤不準確時,浮點十進制值轉換爲浮點二進制值。因此,您可能需要使用Decimal或在基準值中建立偏移量。

0

嗯,還有的float function,可以用來編寫代碼:

low_target = float(tupToSearch[1]) 
high_target = low_target + constant 
[(x[2],x[3]) for x in myTup if low_target<=float(x[1])<=high_target]