我正在制作一个基本的冒泡排序,我仍然是编程的新手,因此我的代码可能效率不高或设计得很好。我的代码:
elif n == -1:
if numbers[n] > numbers[m]:
for i in range(len(numbers) - 1):
numbers2[i + 1] = numbers[i] and numbers[i] != numbers2[i + 1]
print (numbers)
print (numbers2)
print (n)
print (m)
print (i)
if i == len(numbers)-1:
numbers = numbers2
n += 1
m += 1
我在循环中遇到错误,就像你输入:142,324,23123,645,643一样,它会向右推23123,但其余的数字将按降序排列。现在因为这是一个问题我尝试通过创建一个新的if语句来检查最后一个和第一个数字,然后它必须将最后一个数字放在前面[2,1,3] - > [3,2,1]。但是当我这样做时,我使用了一个for循环而没有: - 和数字[i]!= numbers2 [i + 1] - (参见问题),这最终将整行数字改为列表中的第一个数字。 / p>
['23', '431', '63451', '234', '435']
['23', '23', '63451', '234', '435']
['23', '23', '63451', '234', '435']
-1
0
0
['23', '23', '23', '234', '435']
['23', '23', '23', '234', '435']
-1
0
1
['23', '23', '23', '23', '435']
['23', '23', '23', '23', '435']
-1
0
2
['23', '23', '23', '23', '23']
我添加了第二个列表,但后来我尝试了上面的代码,我收到了这个错误:
if numbers[n] > numbers[m]:
TypeError:'>' 'bool'和'str'
的实例之间不受支持所以我搜索了一下,看看我是否可以放一个而不是,但我什么都没发现。很抱歉这是一个很长的问题。
答案 0 :(得分:1)
实现此目标的最简单方法是使用 列表切片 功能:
向右移动
>>> my_list = [1, 2, 3, 4, 5]
>>> my_list[-1:] + my_list[:-1]
[5, 1, 2, 3, 4]
向左移动
>>> my_list = [1, 2, 3, 4, 5]
>>> my_list[1:] + my_list[:1]
[2, 3, 4, 5, 1]
您可以将这些逻辑加入到单个自定义函数中,以便左右移动:
def shift_list(my_list, shift_by):
return my_list[shift_by:] + my_list[:shift_by]
在上面的shift_list
函数中,对于:
n
向左移n
步-n
向右移n
步示例运行:
>>> my_list = [1, 2, 3, 4, 5]
# Shift left by "1" step
>>> shift_list(my_list, 1)
[2, 3, 4, 5, 1]
# Shift left by "2" step
>>> shift_list(my_list, 2)
[3, 4, 5, 1, 2]
# Shift right by "1" step
>>> shift_list(my_list, -1)
[5, 1, 2, 3, 4]
# Shift right by "2" step
>>> shift_list(my_list, -2)
[4, 5, 1, 2, 3]
作为 替代 ,您还可以将itertools.cycle
与列表理解和next
一起使用。它比上面的解决方案简单,但仍然比你的简单:
向右移动
>>> from itertools import cycle
>>> my_list = [1, 2, 3, 4, 5]
>>> my_cycle = cycle(my_list[::-1])
>>> [next(my_cycle) for i in range(len(my_list)+1)][::-1][:-1]
[5, 1, 2, 3, 4]
向左移动
>>> from itertools import cycle
>>> my_list = [1, 2, 3, 4, 5]
>>> my_cycle = cycle(my_list)
>>> [next(my_cycle) for i in range(len(my_list)+1)][1:]
[2, 3, 4, 5, 1]