2014-04-08 61 views
0

因此,我正在研究自頂向下的RPG項目,並對npcs的移動進行了一些更改。 更具體地說,在我移動任何npc之前,我首先檢查它的下一個位置是否基本被佔用。迭代期間打印整個列表,但當前索引

所以很明顯爲了達到這個目的,我需要爲每一個npc檢查所有其他 npcs的當前位置。

所以我的問題是,這是通過對象的列表,並在每個迭代訪問整個列表列表的當前索引元素進行迭代的最佳Python的方式。

我想到了一個辦法是:

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

但我想知道其他任何可能的方式:) 乾杯,雖然我徹底檢查我無法找到一個類似的問題,可以隨意告訴我任何其他可能的重複!

亞歷

+2

我看不出有什麼毛病這種方法 – njzk2

+1

爲什麼無論如何,你是否需要從列表中排除當前的NPC?如果它一動不動,它的新位置就不會和它以前的位置一樣,那麼在列表中留下什麼傷害呢? – Kevin

+0

這很好聽njk2我只是想我的方式可能是一個大列表效率低下。凱文我的想法是,如果我把當前的NPC留在列表中,那麼檢查一個NPC與其他人的職位的方法總是包括檢查一個NPC與自己,所以基本上它不會允許它移動 –

回答

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表現相同。

+0

我認爲這種方法比我的方式更好!謝謝utdemir!我會盡快接受 –

+0

@AlexKoukoulas你甚至測試過代碼嗎? –

+0

對不起,我以爲我刪除了枚舉,錯過了那一塊。 – utdemir

1

如果您正在尋找內存高效和快速的解決方案,那麼您可以在這裏使用itertools.isliceitertools.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 
+0

感謝您的詳細解答! –

+0

我認爲刪除的解決方案更加優雅:>>> for範圍內的noindex(len(my_list)): ... print([elem for index,elem in enumerate(my_list)if index!= noindex]) ' –

+1

@LucasMalor OP的解決方案比這更好,如果在內存中創建新列表沒有問題,那麼爲什麼不使用簡單的快速切片。 –