选择排序器,但我希望输出合并
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
并假设 str
在 else
条款。
为了清楚起见,这很冗长,但我们可以更简洁地编写相同的逻辑,如下所示:
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
.
所以我想制作一个分拣机,但我希望它的输出能够合并。在我的代码中,我从列表中分离了两个不同类型的变量,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
并假设 str
在 else
条款。
为了清楚起见,这很冗长,但我们可以更简洁地编写相同的逻辑,如下所示:
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
.