两个可分列表

w41d8nur  于 2022-09-18  发布在  Java
关注(0)|答案(2)|浏览(99)

我在Python语言中遇到了一个问题,如果清单1中的所有数字都能被清单2中的至少一个数字整除,我需要函数返回True。为此,我尝试使用All函数,如下所示:

for num1 in List1: 
    if all(num1 % num2 == 0 for num2 in List2)
    return True

但这样做的问题是,它会检查列表1中的所有数字是否都能被列表2中的所有数字整除。

我想知道是否有一种方法可以让list1的所有数字都可以被list2中的至少一个数字整除?例如:

List_1=[15,10,4,8,12]List_2=[2,5,3]输出True

List_1=[15,10,7,8,12]List_2=[2,5,3]输出FALSE

在第二种情况下将为FALSE,因为7不能被列表2中的任何一个数字整除

pkwftd7m

pkwftd7m1#

您可以在理解中组合allany

>>> l1=[8,10,20]
>>> l2=[2,3]
>>> any(all(n1%n2==0 for n1 in l1) for n2 in l2)
True

如果您想检查列表1中的任何数字是否可以被列表2中的至少一个数字整除,您可以按如下方式重新构造上面的语句:

>>> l1,l2=[15, 10, 4, 8, 12],[2, 5, 3]
>>> all(any(n1%n2 for n2 in l2) for n1 in l1)
True
2exbekwf

2exbekwf2#

你就快到了。List comprehensions可以包含任意数量的变量,在这种情况下,将考虑这些变量的所有组合。你可以简单地说

return all(l1_elm % l2_elm == 0 for l1_elm in List1 for l2_elm in List2)

这相当于

for l1_elm in List1:
    for l2_elm is List2:
        # if this doesn't evaluate to 0
        if l1_elm % l2_elm:
            return False
return True

顺便说一句,使用snake_case表示变量,使用PascalCase表示类是很习惯的,所以理想情况下,List1List2应该分别编写为list_1(或仅使用list1)和list_2

@ThePyGuy也提出了很好的观点。如果第二个参数是0ZeroDivisionError: integer division or modulo by zero,则modulo operator失败。如果您预期List2可能包含0值,则还应在尝试除法之前进行检查,即将条件修改为if l2_elm == 0 or l1_elm % l2_elm

编辑:OP表示,它们实际上意味着检查List1中的所有值是否可以被List2中的任何值整除。对于这种情况,以下代码是合适的

return any(all(l1_elm % l2_elm == 0 for l1_elm in List1) for l2_elm in List2)

这正是@ThePyGuy最初的答案。这相当于

for l2_elm in List2:
    all_divisible = True
    for l1_elm in List1:
        if l1_elm % l2_elm:
            all_divisible = False
            # this l2_elm didn't work. no need to check further List1
            # values for divisibility
            break
    # this particular l2_elm divided everything successfully, so
    # return True
    if all_divisible:
        return True

# nothing worked, so fail

return False

相关问题