选择排序器,但我希望输出合并

Selection Sorter, but i want the output to merge

所以我想制作一个分拣机,但我希望它的输出能够合并。在我的代码中,我从列表中分离了两个不同类型的变量,integer 和 int。

列表:

nlist = [19, 5, 'cat', 'rabbit', 2, 32, 'mice', 'dog', 7]

代码:

def bubble(collection):
    dlist = [e for e in collection if isinstance(e, int)]
    clist = [e for e in collection if not isinstance(e, int)]
    for endnum in range(len(dlist)-1, 0, -1): 
        print(dlist)
        for i in range(endnum):
            if dlist[i] > dlist[i+1]:
                dlist[i], dlist[i+1] = dlist[i+1], dlist[i]
    for endnumm in range(len(clist)-1, 0, -1): 
        print(clist)
        for j in range(endnumm):
            if clist[j] > clist[j+1]:
                clist[j], clist[j+1] = clist[j+1], clist[j]
    answer = dlist + clist
    print(answer)

输出:

[19, 5, 2, 32, 7]
[5, 2, 19, 7, 32]
[2, 5, 7, 19, 32]
[2, 5, 7, 19, 32]
['cat', 'rabbit', 'mice', 'dog']
['cat', 'mice', 'dog', 'rabbit']
['cat', 'dog', 'mice', 'rabbit']
[2, 5, 7, 19, 32, 'cat', 'dog', 'mice', 'rabbit']

所需输出:

[19, 5, 'cat', 2, 'rabbit', 32, 'mice', 'dog', 7]
[19, 5, 'cat', 2, 32, 'rabbit', 'mice', 'dog', 7]
[19, 5, 'cat', 2, 32, 'rabbit', 'mice', 7, 'dog']
[19, 5, 2, 'cat', 32, 'rabbit', 'mice', 7, 'dog']
[19, 5, 2, 32, 'cat', 'rabbit', 'mice', 7, 'dog']
[19, 5, 2, 32, 'cat', 'rabbit', 7, 'mice', 'dog']
[19, 5, 2, 32, 'cat', 7, 'rabbit', 'mice', 'dog']
[19, 5, 2, 32, 7, 'cat', 'rabbit', 'mice', 'dog']
[5, 19, 2, 32, 7, 'cat', 'rabbit', 'mice', 'dog']
[5, 2, 19, 32, 7, 'cat', 'rabbit', 'mice', 'dog']
[5, 2, 19, 7, 32, 'cat', 'rabbit', 'mice', 'dog']
[5, 2, 19, 7, 32, 'cat', 'rabbit', 'mice', 'dog']
[2, 5, 19, 7, 32, 'cat', 'rabbit', 'mice', 'dog']
[2, 5, 7, 19, 32, 'cat', 'rabbit', 'mice', 'dog']
[2, 5, 7, 19, 32, 'cat', 'mice', 'rabbit', 'dog']
[2, 5, 7, 19, 32, 'cat', 'mice', 'dog', 'rabbit']
[2, 5, 7, 19, 32, 'cat', 'dog', 'mice', 'rabbit']

有什么方法可以让我输出到需要的输出吗?

刚才的那个家伙刚刚解决了一些问题和问题。

一般方法

考虑到您的“大于”关系比 Python 的 >:

复杂一点,您可以解决这个问题
  • 对于两个数字,>适用,
  • 对于两个字符串,>适用,
  • 在任何数字和任何字符串之间,字符串“大于”数字。

现在,实现一个执行此操作的函数,并在您的算法中使用它代替 >

实施该方法

让我们将该逻辑写入函数 my_greater_than:

def my_greater_than(a, b):
    """greater than where an int is "smaller" than other things"""
    if isinstance(a, int):
        if isinstance(b, int):
            return a > b
        else:
            return False
    else:
        if isinstance(b, int):
            return True
        else:
            return a > b

你会注意到我在这里走了一条捷径:我不检查 str,我只检查 int 并假设 strelse条款。

为了清楚起见,这很冗长,但我们可以更简洁地编写相同的逻辑,如下所示:

def my_greater_than(a, b):
    """greater than where an int is "smaller" than other things"""
    if isinstance(a, int):
        return isinstance(b, int) and a > b
    else:
        return isinstance(b, int) or a > b

现在,让我们用它代替冒泡排序代码中的 >。我完全保留了您的冒泡排序算法,但只调用了一次我们在整个列表中使用的大于函数。

def bubble(collection):
    my_list = list(collection)
    for endnum in range(len(my_list)-1, 0, -1): 
        print(my_list)
        for i in range(endnum):
            if my_greater_than(my_list[i], my_list[i+1]):
                my_list[i], my_list[i+1] = my_list[i+1], my_list[i]
    print(my_list)

现在我们可以在您的列表中调用它以获得您想要的输出:

nlist = [19, 5, 'cat', 'rabbit', 2, 32, 'mice', 'dog', 7]
bubble(nlist)

打印

[19, 5, 'cat', 'rabbit', 2, 32, 'mice', 'dog', 7]
[5, 19, 'cat', 2, 32, 'mice', 'dog', 7, 'rabbit']
[5, 19, 2, 32, 'cat', 'dog', 7, 'mice', 'rabbit']
[5, 2, 19, 32, 'cat', 7, 'dog', 'mice', 'rabbit']
[2, 5, 19, 32, 7, 'cat', 'dog', 'mice', 'rabbit']
[2, 5, 19, 7, 32, 'cat', 'dog', 'mice', 'rabbit']
[2, 5, 7, 19, 32, 'cat', 'dog', 'mice', 'rabbit']
[2, 5, 7, 19, 32, 'cat', 'dog', 'mice', 'rabbit']
[2, 5, 7, 19, 32, 'cat', 'dog', 'mice', 'rabbit']

补充说明

  • 您可能注意到我在 bubble() 的第一行将 collection 复制到 my_list 中。那是因为我不想修改提供给我的输入列表。如果我们直接在 collection 上工作,我们会发现 nlist 在调用 bubble().
  • 之后也会排序
  • 通过调用 list() 复制集合的另一个原因是它让我们接受任何可迭代的东西。集合可以是一个集合、一个列表、一个元组、一个字典或 Python 中的任何其他可迭代对象,我们的排序函数无论如何都会对它起作用。
  • 我打印输出是因为那是你所做的,但我通常会在那里有一个 return 语句:将 bubble() 最后一行的 print(my_list) 替换为 return my_list.