真的不确定这适合的地方.说,我有一个清单:
>>>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循环遵守这些规则.
关于我为什么需要这个; 这是用于分析纸牌游戏中的有效游戏,并且将从给定手牌的中间牌检查到每一端,直到可以播放有效的牌.
您可以继续从列表中间删除:
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)
首先,这是一个非常有用的通用实用程序来交错两个序列:
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)
您还可以玩索引游戏,例如:
>>> 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)
| 归档时间: |
|
| 查看次数: |
1910 次 |
| 最近记录: |