簡體   English   中英

一種用於根據條件彈出列表列表的襯墊

[英]One liner for poping list of lists based on condition

我有以下列表:

leftoverbricks = [['purple1', 'y8', 'x0', 'y8', 'x1'], ['purple2', 'y6', 'y0', 'x8', 'y0'], ['purple3', 'z2', 'x8', 'z2', 'x0']]

startingbrick = ['purple3', 'z2', 1, 1]

我想從 leftoverbricks 中彈出一個元素,其中startingbrick[0]與來自 leftoverbricks 的列表列表的第一個元素匹配,所以leftoverbricks[][0]

我創建了一個有效的函數:

def removebrick(tempbrick, templist):
    reducedlist = templist
    for tempelement in reducedlist:
        if tempelement[0] == tempbrick[0]:
            reducedlist.pop(reducedlist.index(tempelement))
    return reducedlist

並給出正確的結果:

reducedleftoverbricks = removebrick(startingbrick, leftoverbricks)

reducedleftoverbricks = [['purple1', 'y8', 'x0', 'y8', 'x1'], ['purple2', 'y6', 'y0', 'x8', 'y0']]

但這並不優雅。 我希望這樣的事情可以用一個襯墊並通過改變原始的reducedleftoverbricks leftoverbricks 我在一個班輪列表理解上做了幾次嘗試,但到目前為止都失敗了。

就個人而言,我會考慮使用過濾器。 請注意,過濾器將被延遲評估,因此您可以在您想要減少列表的地方評估整個過濾器。

for brick in filter(lambda n: n[0] != startingbrick[0], leftoverbricks):
   do_more_work(brick)

這將是filter()的一個很好的用例。

例如,

leftoverbricks = [['purple1', 'y8', 'x0', 'y8', 'x1'], ['purple2', 'y6', 'y0', 'x8', 'y0'], ['purple3', 'z2', 'x8', 'z2', 'x0']]
startingbrick = ['purple3', 'z2', 1, 1]

def removebrick(tempbrick, templist):
    key, *_ = templist
    return list(filter(lambda v: v[0] != key, tempbrick))

print(removebrick(leftoverbricks, startingbrick))

輸出:

[['purple1', 'y8', 'x0', 'y8', 'x1'], ['purple2', 'y6', 'y0', 'x8', 'y0']]

筆記:

這不會修改輸入列表 (leftoverbricks)。 如果您希望它具有破壞性,則只需將此函數的返回值分配給適當的變量

您可以使用列表理解從leftoverbricks中刪除與startingbrick的第一個元素匹配的元素。

例子:

leftoverbricks = [['purple1', 'y8', 'x0', 'y8', 'x1'], ['purple2', 'y6', 'y0', 'x8', 'y0'], ['purple3', 'z2', 'x8', 'z2', 'x0']]
startingbrick = ['purple3', 'z2', 1, 1]

leftoverbricks = [brick for brick in leftoverbricks if brick[0] != startingbrick[0]]
print(leftoverbricks)

這將修改leftoverbricks到位,因此您不需要創建新的列表變量。

輸出:

[['purple1', 'y8', 'x0', 'y8', 'x1'], ['purple2', 'y6', 'y0', 'x8', 'y0']]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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