[英]python for loop list plus one item
我正在根據屏幕上對象的位置處理對象的鼠標點擊。 我記錄了鼠標單擊的xy坐標,看它是否與允許點擊的任何對象相匹配。 對象在不同的列表中或只是單個對象,但是我希望它們在一個大的列表中,所以我可以循環遍歷整個事物,如果點擊其中一個對象,則執行工作,中斷。 您只能單擊一個對象。
第一種方法:我現在是怎么做的:
list = [obj1, obj2, obj3]
singleobj
copylist = list
copylist.append(singleobj)
for item in copylist:
if item.pos == mouseclick.pos:
doWork(item)
break
第二種方法:我寧願做類似下面的事情,但顯然list+singleobj
無效:
for item in list+singleobj:
if item.pos == mouseclick.pos:
doWork(item)
break
第三種方法:或者如果我絕對必須,我可以做這個可怕的可怕代碼:
list = [obj1, obj2, obj3]
foundobj = None
for item in list:
if item.pos == mouseclick.pos:
foundobj = item
break
if foundobj is None:
if singleobj.pos == mouseclick.pos:
foundobj = singleobj
#possibly repeated several times here....
if foundobj is not None:
doWork(foundobj)
第一種方法似乎很慢,因為我必須將所有(可能很多)列表和單個對象復制到一個列表中。
第二種方法看起來很理想,因為它結構緊湊,易於維護。 雖然,現在它只是偽代碼。
第三種方法是笨重而笨重。
我應該使用哪種方法? 如果是第二個,你能給出實際代碼嗎?
對於itertools.chain
方法,您需要itertools.chain
for item in itertools.chain(list, [singleobj]):
...
DrTyrsa的答案就是我對你的確切問題所說的話,但是讓我給你一些其他提示:
copylist = list
copylist.append(singleobj)
這不會創建列表的副本,您可能想要做copylist = list[:]
或copylist = list(lst)
(我在這里將名稱更改為lst
,因為list
是內置的。你知道)。
關於你的第二種方法,你可以這樣做:
for item in list + [singleobj]:
...
如果你打算使用itertools,一個微小的改進是使用一個元組而不是一個列表來保存額外的對象,因為它更輕一點:
for item in itertools.chain(list, (singleobj,)):
...
另一件事是你不應該循環你的對象,看看坐標是否匹配,你可以讓它們的邊界(如BSP樹或四叉樹)進行索引,並做更快的查找。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.