双迭代的替代方案

时间:2013-12-01 21:09:34

标签: python iteration

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

的伪代码:

for value1 in my_list:
    for value2 in my_list:
        if meets_requirements(value1, value2):
            to_be_removed.append(value2)

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

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

如果没有,有什么方法可以让它更具可读性和“感觉”,就像质量代码一样吗?

3 个答案:

答案 0 :(得分:5)

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

my_list = [y for y in my_list 
             if not any(meets_requirement(x,y) for x in my_list)]

答案 1 :(得分:4)

您可以在此处使用itertools.product。虽然这仍然等同于嵌套循环,但更具可读性:

from itertools import product
for value1, value2 in product(my_list, repeat=2):
    if meets_requirements(value1, value2):
        to_be_removed.append(value2)

答案 2 :(得分:2)

我会在list comprehension中使用itertools moduleproduct()

from itertools import product
to_be_removed = [v2 for v1, v2 in product(mylist, repeat=2) 
                               if meets_requirement(v1, v2)]

关注@ tobias_k的评论,如果您不希望结果中有相同值的多个实例,并且元素的顺序无关紧要,则可以使用set comprehension代替:

to_be_removed = {v2 for v1, v2 in product(mylist, repeat=2) 
                               if meets_requirement(v1, v2)}