双迭代的替代方案

Kur*_*tis 5 python iteration

我有一个程序,要求我检查列表中的每个值与同一列表中的每个其他值.如果我确定了满足某些要求的内容,我会将其添加到另一个List中,以便在此过程完成后将其删除.

伪代码:

for value1 in my_list:
    for value2 in my_list:
        if meets_requirements(value1, value2):
            to_be_removed.append(value2)
Run Code Online (Sandbox Code Playgroud)

这看起来很难看.变量的命名约定很难分配或理解.有潜力(虽然非常不可能,在这种情况下)我可能会在迭代时不小心修改列表.性能可能存在问题.

有没有更好的替代方法来执行这些双重迭代?

如果没有,有没有什么方法可以使这个更具可读性和"感觉"像质量代码?

bco*_*rso 5

您不必先找到删除的值.只需一次创建所需的列表:

my_list = [y for y in my_list 
             if not any(meets_requirement(x,y) for x in my_list)]
Run Code Online (Sandbox Code Playgroud)

  • 虽然它不一定相同,但最好从`any()`中删除`[]`并让它短路.如果`meets_requirement`没有副作用,它会产生相同的结果. (2认同)