在for循环期间反转列表

时间:2017-03-12 00:32:04

标签: python list

我想知道如何实现这个效果:

我正在研究基于文本的游戏,我将玩家存储在列表中,我希望能够遍历列表,直到只剩下1个人。

到目前为止,我得到了

While len(mylist) != 1:
 for player in game:
   ...

但是遇到问题的地方是我希望能够在设置某个标志时反转for循环。我需要能够扭转它,因为游戏的一部分能够扭转转弯顺序。任何人对我将如何处理有任何想法?

3 个答案:

答案 0 :(得分:0)

while 0 < i < range(len(game)):

    if flag:
        i += 1
    else:
        i -= 1

    player = game[i]

答案 1 :(得分:0)

你可以使用反向迭代器:

game_iter = game if flag else reversed(game)
for player in game_iter:
   ...

答案 2 :(得分:0)

根据您对问题的描述,听起来您在迭代时删除字符 - 如果这是正确的,那么使用deque (double-ended queue)最简单。它是标准Python库中可用的有用集合类型,值得了解。如果你想从列表中弹出字符,并切换你在列表中移动的方向,你可以使用布尔标志来改变从前面或后面弹出的方向。这是一个如何做到这一点的例子:

from collections import deque
import random

# Populate empty deck with integers 1 to 10
d = deque()
n = 10
for i in range(n):
    d.append(i+1)

print("Initial deque:")
print(d)

# Note you can also rotate the dequeue:
d.rotate(2)
d.rotate(-2)

# Pop from the list,
# moving from the front of the list (right) to the back of the list (left).
# If a random event happens, we switch directions and pop from the back (left).

print("Popping:")
move_forward = True
while d:
    if(move_forward):
        nxt = d.pop()
        print("Moving forward: %s"%(nxt))
    else:
        nxt = d.popleft()
        print("Moving backward: %s"%(nxt))

    # 70% chance that we continue moving forward
    if( random.random() < 0.7 ):
        move_forward = not move_forward

这会使用一些整数初始化一个双端队列,然后遍历双端队列并移除项目,在70%的时间内反转方向。这是程序的输出,我相信这是你正在寻找的行为:

Initial deque:
deque([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
Popping:
Moving forward: 10
Moving backward: 1
Moving backward: 2
Moving forward: 9
Moving backward: 3
Moving backward: 4
Moving forward: 8
Moving forward: 7
Moving backward: 5
Moving forward: 6

修改:如果您想要保存字符而不是丢失它们,那么当您弹出时,您可以创建一个名为deque的新e,就在您之后致电nxt = d.pop()nxt = d.popleft(),您可以将其附加到ee.append(nxt)。 (我没有看到任何优雅的方法来保留角色的原始顺序。)