[英]One liner function for sorting a string list of lists in ascending, descending order based on varying criteria in python
[英]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.