所以我正在研究自上而下的RPG项目,我对npcs的运动做了一些改变。 更具体地说,在我移动任何npc之前,我首先检查它的下一个位置是否基本上被采用。
很明显,为了实现这一点,我需要每个npc检查所有其他 npcs的当前位置。
所以我的问题是迭代对象列表的最好的pythonic方法,并且在每次迭代中访问整个列表但列表的元素与当前指数。
我想到的一种方式是:
for index,element in enumerate(my_list):
print my_list[:index] + my_list[index + 1:]
但我想知道其他任何可能的方法:) 干杯,虽然我彻底检查了,但我找不到类似的问题,所以请随时告诉我任何其他可能的重复!
亚历
答案 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