如何使用列表理解从列表中间丢弃?

2024-06-28 11:38:49 发布

您现在位置:Python中文网/ 问答频道 /正文

我可以用索引来做这件事,但我认为必须有一个更干净的方法来使用列表理解。我是初学者。我希望这不会让人尴尬。谢谢

for x in firstList:
    firstFunc(x)
    secondFunc(x)
    x = process(x)
    if x.discard == True:
        (get rid of x)
secondList.append(firstList)

Tags: of方法intrue列表forgetif
3条回答

几件事:

  • 您不能append一个列表,您需要使用extend。在
  • 不需要== True位,只需使用if x.discard:
  • 您宁愿创建一个新的列表,其中包含您不希望丢弃的值,也不会因删除而污染循环。在

所以你会得到一些线索:

tmp = []
for x in first_list:
    x = process(x)
    if not x.discard:
        tmp.append(x)
second_list.extend(tmp)

列表理解显然更像Python,不过:

^{pr2}$

只是一个想法,对文档几乎没有帮助,但为什么不试试:

def masterFunc(x):
    firstFunc(x)
    secondFunc(x)
    process(x)
    return x.discard

secondList = [ x for x in firstList if masterFunc(x) ]

好消息:严格说来,照你说的做。 坏消息:它隐藏了firstFunc、secondFunc和process

在这个例子中,您似乎已经在副作用和命令/查询分离方面遇到了麻烦,所以我认为这次黑客攻击并不像清理代码那样高尚。您可能会发现有些方法需要反转(x.firstFunc()而不是firstFunc(x)),而其他方法则需要分解。甚至还有比“x.discard”更好的方法来处理过滤。在

你知道,你最好的解决方案就是按你喜欢的方式初始化secondList,并在一个常规的循环中执行所有三个函数,因为它们都是依赖的,并且包含的逻辑不仅仅是过滤(你说进程集属性。。。我想你不是指丢弃):

# If secondList not initialized...
secondList = []
for x in firstList:
    firstFunc(x)
    secondFunc(x)
    process(x)
    if not x.discard:
        secondList.append(x)

列表理解在这里没有太大的帮助,因为你在每个函数中进行处理(尽管它们会减少一两行;这取决于你在“干净”的代码中寻找什么)。如果all process()did在新列表中返回True,如果该项不在新列表中,则返回False,那么下面的方法会更好,IMO


如果firstFunc(x)和secondFunc(x)确实更改了x.discard after process()的结果,而process(x)的结果正好是x,那么我将在您的情况下执行以下操作:

^{pr2}$

如果过程(x)的结果与x不同,正如您的示例所示,您还可以将最后一行更改为以下内容:

interimList = [ process(x) for x in firstList ]
secondList = [ x for x in interimList if not x.discard ]

请注意,如果要将这些结果附加到secondList,请使用第二个列表。扩展([...]). 在

编辑:我意识到我错误地写了“donot”change,但我的意思是如果他们真的更改process()的结果。在

编辑2:清理说明/代码。在

相关问题 更多 >