3

大家好,我需要在 python 中排序和编写排序函数的帮助。我正在尝试编写一个函数insert_in_order,它需要一个字符串列表和一个字符串。我正在尝试这样做,假设项目已经按字母顺序排序,我必须将项目插入项目中的正确位置

关于我面临的同样问题,我还想纠正一个remove接受列表和字符串的函数。此函数应删除 items 中第一次出现item。此外,如果item在items中根本没有出现,该函数应该保持items不变。

编辑:

我原来的一组功能如下

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函数应该被添加到函数中,这样当我运行我的测试时,它们就会通过。但我每次都得到一个“失败的测试”。

我真的很困惑,任何为我指明正确方向的帮助将不胜感激。

4

3 回答 3

3

使用bisect.insort_left将项目x插入到列表中a,并假设a已排序,则保持排序。

使用list.remove从列表中删除第一次出现的值。如果值不在列表中,此函数会引发 ValueError。因此,您需要将调用包装在 atry..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']
于 2013-04-06T21:09:16.513 回答
1

关于您的排序问题,一个不需要额外模块的快速解决方案(在计算上可能不是最佳的,但在许多情况下已经足够好了):

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

要删除项目,只需将列表的remove方法与异常处理程序一起使用,如@unutbu 的解决方案中所述。

于 2013-04-06T21:16:46.563 回答
0

查看bisect在排序列表中找到插入或删除位置的模块。

另外,请注意,插入和删除listO(n)因为它们需要将所有项目移动到插入或删除位置的右侧。您可以查看blist要使用的模块,而不是listO(log(n)).

于 2013-04-06T21:11:28.680 回答