我有一个程序,要求我检查列表中的每个值与同一列表中的每个其他值。如果我确定了符合某些要求的内容,我会将其添加到另一个列表中,以便在此过程完成后将其删除。
的伪代码:
for value1 in my_list:
for value2 in my_list:
if meets_requirements(value1, value2):
to_be_removed.append(value2)
这看起来很难看。变量的命名约定很难分配或理解。有潜力(虽然非常不可能,在这种情况下)我可能会在迭代时不小心修改列表。性能可能存在问题。
是否有更好的替代方法来执行这些双重迭代?
如果没有,有什么方法可以让它更具可读性和“感觉”,就像质量代码一样吗?
答案 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
module和product()
:
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)}