如何将列表向右移动一个元素[1,2,3,4] - > [4,1,2,3]?左边[1,2,3,4] - > [2,3,4,1]?

时间:2018-01-14 15:43:09

标签: python python-3.x

我正在制作一个基本的冒泡排序,我仍然是编程的新手,因此我的代码可能效率不高或设计得很好。我的代码:

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'

的实例之间不受支持

所以我搜索了一下,看看我是否可以放一个而不是,但我什么都没发现。很抱歉这是一个很长的问题。

1 个答案:

答案 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]