选择排序,但我希望输出合并
Posted
技术标签:
【中文标题】选择排序,但我希望输出合并【英文标题】:Selection Sorter, but i want the output to merge 【发布时间】:2022-01-14 07:47:12 【问题描述】:所以我想做一个排序器,但我希望它的输出合并。在我的代码中,我将两个不同类型的变量从列表中分离出来,整数和整数。
列表:
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']
有什么方法可以让我输出到所需的输出?
之前的同一个家伙刚刚解决了一些问题和问题。
【问题讨论】:
【参考方案1】:一般方法
您可以通过考虑您的“大于”关系比 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
,并在else
子句中假设str
。
为了清楚起见,这非常冗长,但我们可以更简洁地编写相同的逻辑,如下所示:
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 中的任何其他可迭代对象,我们的排序函数无论如何都可以处理它。
我打印了输出,因为这就是你所做的,但我通常会有一个返回语句:将bubble()
最后一行的print(my_list)
替换为return my_list
。
【讨论】:
你能帮我做什么,做什么? 嗯,是的,我可以,但我现在必须问:这是编程作业吗?无论如何,这显然是一个学习练习,因此我认为我已经提供了您需要继续进行的关键见解,如果您自己解决下一步,您将从练习中获得更多。 一个没有评分的练习,这就是为什么我对下一步该做什么知之甚少 好的,我会字节的。即将编辑。以上是关于选择排序,但我希望输出合并的主要内容,如果未能解决你的问题,请参考以下文章