簡體   English   中英

python for循環列表加一個項目

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM