2013-04-06 84 views
3

美好的一天大家, 我需要排序和編寫python排序功能的幫助。我正在嘗試編寫一個函數insert_in_order,其中包含字符串項目和字符串項目的列表。我試圖做到這一點假設項目已經排序的字母順序,我必須在問候插入項目到正確的位置在項目在Python中排序項目

而且

同樣的問題我是面對,我也想要一個功能remove它需要一個列表項目和字符串項目。此功能應刪除項目的第一個出現項目項目。此外,如果項目完全沒有發生在項目中,則該功能應保留項目不變。

編輯:

我原來的功能集如下

def read_list(fname): 
    items = [] 
    with open(fname, 'r') as fin: 
     for line in fin: 
      items = insert_in_order(items, line[:-1]) 

    return items 


def write_list(items, fname): 
    fout = open(fname, 'w') 
    for item in items: 
     fout.write(item + '\n') 
    fout.close() 

,我也有這應該測試這些功能的測試文件:

class TestLabThre(unittest.TestCase): 
    def test_read_list(self): 
     self.assertEqual(
       read_list('lab06ReadTest.txt'), 
       ['a', 'b', 'c', 'd', 'e']) 

def test_write_list(self): 
    write_list(['a', 'b', 'c', 'd', 'e'], 'lab06WriteTest.txt') 
    in_file = open('lab06WriteTest.txt', 'r') 
    self.assertEqual(in_file.read(), 'a\nb\nc\nd\ne\n') 

insert_in_orderremove功能應該被添加到功能,所以當我運行我的測試,他們通過。但我每次都會收到一個「失敗的測試」。

我真的很困惑,任何幫助指出我在正確的方向將不勝感激。

回答

3

使用bisect.insort_left插入項目x到列表a,並保持排序,假設a排序。

使用list.remove可從列表中刪除第一次出現的值。如果該值不在列表中,此函數會引發ValueError。所以您需要將呼叫打包到try..except以處理異常 - 請參閱下面的示例。


import bisect 

cheese = sorted('manchego stilton brie gouda'.split()) 
print(cheese) 
# ['brie', 'gouda', 'manchego', 'stilton'] 

item = 'gorgonzola' 
bisect.insort_left(cheese, item) 
print(cheese) 
# ['brie', 'gorgonzola', 'gouda', 'manchego', 'stilton'] 

try:  
    cheese.remove('manchego') 
except ValueError: 
    pass 
print(cheese) 
# ['brie', 'gorgonzola', 'gouda', 'stilton'] 
+0

爲什麼不使用'bisect.bisect_left'來查找項目的位置,然後使用'list.pop'來刪除它。這會搜索'log(n)',而不是'O(n)'? – ovgolovin 2013-04-06 21:15:13

+0

[從Python列表中刪除項目是O(n)](http://wiki.python.org/moin/TimeComplexity),所以無論我們使用list.pop還是list.remove,我們仍然是O (N)。 – unutbu 2013-04-06 21:17:56

+0

是的。但那爲什麼要使用'bisect'呢? – ovgolovin 2013-04-06 21:19:01

0

bisect模塊,其發現在排序列表插入或缺失的位置。

此外,請注意,list中的插入和刪除爲O(n),因爲它們需要將所有項目移到插入或刪除位置的右側。您可以查看blist模塊來代替list,它可以在O(log(n))中執行這些操作。

1

關於你的排序問題,一個快速的解決方案,它不需要額外的模塊(這可能不是計算最優的,但在許多情況下不夠好):

>>> your_list = ['a', 'b', 'c'] 
>>> your_list.append('baa') 
>>> your_list.sort() 
>>> print your_list 
['a', 'b', 'baa', 'c'] 

對於刪除項目,僅使用列表的remove方法使用異常處理程序,如@unutbu's解決方案中所述。

+0

我試圖在函數格式中實現它。請看我的編輯(在我原來的帖子中) – Kuma 2013-04-06 22:54:03

+0

所以寫一個函數。我覺得也許你應該回去閱讀一些教程,如果你不能自己寫一個函數;這是非常基本的東西。 – 2013-04-07 08:06:56