在迭代期间打印整个列表但是当前索引

时间:2014-04-08 17:20:34

标签: python list python-2.7 iteration

所以我正在研究自上而下的RPG项目,我对npcs的运动做了一些改变。 更具体地说,在我移动任何npc之前,我首先检查它的下一个位置是否基本上被采用。

很明显,为了实现这一点,我需要每个npc检查所有其他 npcs的当前位置。

所以我的问题是迭代对象列表的最好的pythonic方法,并且在每次迭代中访问整个列表列表的元素与当前指数。

我想到的一种方式是:

for index,element in enumerate(my_list):
    print my_list[:index] + my_list[index + 1:]

但我想知道其他任何可能的方法:) 干杯,虽然我彻底检查了,但我找不到类似的问题,所以请随时告诉我任何其他可能的重复!

亚历

2 个答案:

答案 0 :(得分:1)

实际上,您的方法非常易读,但对于大型列表来说效率低下(它每次都会再次构建列表)。

我可能会使用一个简单的for循环:

for i, j in enumerate(my_list):
    for elem in (v for k, v in enumerate(my_list) if k != i):
        print elem, 

编辑:为了提高性能,您可以使用itertools.ifilter,它不会构建列表。在Python 3上,内置filter的行为相同。

答案 1 :(得分:1)

如果您正在寻找内存效率和快速解决方案,那么您可以在itertools.islice使用itertools.chain。这比@ utdemir的solution要快,因为在过滤步骤中不涉及Python for循环:

from itertools import islice, chain

def islice_ashwch(my_list):
    for i, j in enumerate(my_list):
        for elem in chain(islice(my_list, i), islice(my_list, i+1, None)):
            pass

def gen_utd(my_list):
    #https://stackoverflow.com/a/22944093/846892
    for i, j in enumerate(my_list):
        for elem in (v for k, v in enumerate(my_list) if k != i):
            pass

时间比较:

In [6]: lst = range(100)

In [7]: %timeit gen_utd(lst)
1000 loops, best of 3: 680 µs per loop

In [8]: %timeit islice_ashwch(lst)
1000 loops, best of 3: 204 µs per loop

In [9]: lst = range(1000)

In [10]: %timeit gen_utd(lst)
10 loops, best of 3: 63.3 ms per loop

In [11]: %timeit islice_ashwch(lst)
100 loops, best of 3: 16.2 ms per loop