Python从列表的中间开始迭代,然后检查其中一个sid

2024-05-13 10:02:36 发布

您现在位置:Python中文网/ 问答频道 /正文

真的不知道这个适合哪里。我有一张单子:

>>>a = [1, 2, 3, 4, 5, 6, 7]

我怎样才能以这样的方式迭代它,它会先检查4,然后检查5,然后检查3,然后检查6,然后再检查2(对于更大的列表,依此类推)?我只能算出中间值

^{pr2}$

我真的不知道如何应用这个方法,也不确定我计算中间值的方法是最好的方法。我曾考虑过获取两个索引,在每次迭代之后,对每个索引加1和减1,但不知道如何使for循环遵守这些规则。在

至于我为什么需要这个,它是用来分析纸牌游戏中有效的打法,它会从一手牌的中间牌一直检查到每一头,直到一张有效的牌可以玩为止。在


Tags: 方法游戏列表for规则方式单子纸牌
3条回答

你可以继续从列表中间删除:

lst = range(1, 8)
while lst:
    print lst.pop(len(lst)/2)

这并不是性能最佳的解决方案(从列表中删除项很昂贵),但它很简单-对于一个简单的游戏来说已经足够好了。在

编辑:

性能更稳定的解决方案是一个生成器,它计算元素位置:

^{pr2}$

首先,here是一个非常有用的通用实用程序,可以交错两个序列:

def imerge(a, b):
    for i, j in itertools.izip_longest(a,b):
        yield i
        if j is not None:
            yield j

这样,您只需imerge

^{pr2}$

reversed(a[: len(a) / 2])

你也可以玩索引游戏,例如:

>>> a = [1, 2, 3, 4, 5, 6, 7]
>>> [a[(len(a) + (~i, i)[i%2]) // 2] for i in range(len(a))]
[4, 5, 3, 6, 2, 7, 1]

>>> a = [1, 2, 3, 4, 5, 6, 7, 8]
>>> [a[(len(a) + (~i, i)[i%2]) // 2] for i in range(len(a))]
[4, 5, 3, 6, 2, 7, 1, 8]

相关问题 更多 >