python-3.x 一个用于根据条件弹出列表列表的行程序

n1bvdmb6  于 2022-12-20  发布在  Python
关注(0)|答案(3)|浏览(138)

我有以下清单:
第一个月
以及
startingbrick = ['purple3', 'z2', 1, 1]
我想从leftverbricks中取出一个元素,其中startingbrick[0]匹配leftverbricks中list的第一个元素,所以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']]
但这并不优雅。我希望这样的事情可以用一个liner来完成,并通过改变原始的leftoverbricks列表,而不是创建一个新的列表变量reducedleftoverbricks。我做了一些尝试,在一个liner列表理解,但到目前为止失败。

igetnqfo

igetnqfo1#

可以使用列表解析从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']]
eit6fx6z

eit6fx6z2#

就我个人而言,我会考虑使用一个过滤器,注意过滤器将被延迟求值,所以你可以在你想要缩减列表的地方求值整个过滤器。

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

w1e3prcc3#

对于 * 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']]
    • 注:**

这并不修改输入列表(leftverbricks),如果你希望它是破坏性的,那么只要把这个函数的返回值赋给适当的变量

相关问题