Python - 从列表中间开始迭代,然后检查任一方

Lae*_*ica 4 python iteration

真的不确定这适合的地方.说,我有一个清单:

>>>a = [1, 2, 3, 4, 5, 6, 7]
Run Code Online (Sandbox Code Playgroud)

如何以这样的方式迭代它,它将首先检查4,然后是5,然后是3,然后是6,然后是2(对于更大的列表,依此类推)?我只能解决中间问题

>>>middle = [len(a)/2 if len(a) % 2 = 0 else ((len(a)+1)/2)]
Run Code Online (Sandbox Code Playgroud)

我真的不确定如何应用这个,我也不确定我的中间方式是最好的方法.我想过抓住两个索引,每次迭代后,添加1并从每个索引中减1,但不知道如何使for循环遵守这些规则.

关于我为什么需要这个; 这是用于分析纸牌游戏中的有效游戏,并且将从给定手牌的中间牌检查到每一端,直到可以播放有效的牌.

m.w*_*ski 7

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

lst = range(1, 8)
while lst:
    print lst.pop(len(lst)/2)
Run Code Online (Sandbox Code Playgroud)

这不是性能方面的最佳解决方案(从列表中移除项目很昂贵),但它很简单 - 对于简单的游戏来说足够好.

编辑:

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

def iter_from_middle(lst):
    try:
        middle = len(lst)/2
        yield lst[middle]

        for shift in range(1, middle+1):
            # order is important!
            yield lst[middle - shift]
            yield lst[middle + shift]

    except IndexError: # occures on lst[len(lst)] or for empty list
        raise StopIteration
Run Code Online (Sandbox Code Playgroud)


Ami*_*ory 6

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

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

有了它,你只需要 imerge

a[len(a) / 2: ]
Run Code Online (Sandbox Code Playgroud)

reversed(a[: len(a) / 2])
Run Code Online (Sandbox Code Playgroud)


Ste*_*ann 6

您还可以玩索引游戏,例如:

>>> 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]
Run Code Online (Sandbox Code Playgroud)