我可以使用索引来做到这一点,但我认为必须使用列表推导更清晰的方式。我是初学者。我希望这不是一件令人尴尬的事情。感谢
for x in firstList:
firstFunc(x)
secondFunc(x)
x = process(x)
if x.discard == True:
(get rid of x)
secondList.append(firstList)
答案 0 :(得分:2)
只是一个想法,它对文档做的很少,但为什么不尝试:
def masterFunc(x):
firstFunc(x)
secondFunc(x)
process(x)
return x.discard
secondList = [ x for x in firstList if masterFunc(x) ]
好消息:严格来说,你问的是什么。 坏消息:它隐藏了firstFunc,secondFunc和process
听起来你在示例中已经遇到了副作用和命令/查询分离的问题,所以我认为这个hack并不像清理代码那么高贵。您可能会发现某些方法需要反转(x.firstFunc()而不是firstFunc(x))而其他方法需要拆分。甚至可能有比'x.discard'更好的方法来处理过滤。
答案 1 :(得分:1)
你知道,你最好的解决方案是真正按照你喜欢的方式初始化secondList,并在常规循环中完成所有三个函数,因为它们都依赖并包含不只是过滤的逻辑(你说过程集属性。 ..我假设你的意思不是丢弃):
# If secondList not initialized...
secondList = []
for x in firstList:
firstFunc(x)
secondFunc(x)
process(x)
if not x.discard:
secondList.append(x)
列表推导在这里没有太多帮助,因为你在每个函数中进行处理(尽管它们需要一两行;取决于你在“干净”代码中寻找的内容)。如果所有process()都返回True,如果该项应该在新列表中,并且如果该项不在新列表中则返回False,那么下面的确会更好,IMO。
如果firstFunc(x)和secondFunc(x)确实在process()之后更改了x.discard的结果,并且process(x)的结果只是x,我会在你的情况下执行以下操作:
for x in firstList:
firstFunc(x)
secondFunc(x)
secondList = [ x for x in firstList if not process(x).discard ]
如果过程(x)的结果与x不同,正如您的样本似乎表明的那样,您也可以将最后一行更改为以下内容:
interimList = [ process(x) for x in firstList ]
secondList = [ x for x in interimList if not x.discard ]
注意,如果要将这些结果附加到secondList,请使用secondList.extend([...])。
编辑:我意识到我错误地写了“do not ”更改,但我的意思是他们确实改变了process()的结果。
编辑2:清理描述/代码。
答案 2 :(得分:0)
编辑:x.discard需要进程(x),这意味着答案是:
没有更清洁的方式。你做这件事的方式已经很干净了。
旧答案:
不是,不。你可以这样做:
def process_item(x):
firstFunc(x)
secondFunc(x)
x = process(x)
def test_item(x):
return x.discard == False
list = [process_item(x) for x in firstList if test_item(x)]
但这不是更清晰,而且在处理它之前需要设置x.discard,它似乎不是来自你的代码。
列表理解不是“更清洁”。它们是编写简单列表处理的较短方式。列表处理涉及三个步骤。这不是真的“简单”。 :)
答案 3 :(得分:0)
一些事情:
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)
但是,列表理解显然会更加pythonic:
[i for i in first_list if not process(i).discard]
答案 4 :(得分:0)
听起来像
def allProcessing(x)
firstFunc(x)
secondFunc(x)
return !(process(x).discard)
newList = filter(allProcessing, oldList)
答案 5 :(得分:0)
将其写为两个列表推导,一个用于组装可能需要过滤的数据,另一个用于过滤。 make firstFunc和secondFunc返回x(如进程那样),然后你可以像这样编写它:
unfilteredList = [secondFunc(firstFunc(x)) for x in firstList]
secondList = [x for x in unfilteredList if not x.discard]