我试图在列表中找到两个可以互相整除的数字。我设法通过在同一列表上放置两个循环来比较数字直到找到一对来设法做到这一点。
是否可以使用条件语句轻松地将此代码压缩为一行或两行?
def FindDivisible(j):
for i in j:
for m in j:
if int(i) % int(m) == 0 and int(i) != int(m):
return([int(i),int(m)])
我确实理解这根本不是非常pythonic。但是,我确实想知道这是否可能,以及实现这一目标的好方法。
答案 0 :(得分:0)
这个单行将获得可迭代j
中元素的所有可分组合:
[([int(i),int(m)]) for m in j for i in j if int(i) % int(m) == 0 and int(i) != int(m)]
以上只是将您的代码翻译成 list comprehension 。一个区别是,这将找到所有组合,而您的原始循环代码将返回第一个成功的组合。如果要在第一个组合后退出,则显式循环是正确的选择。
例如:
>>> j=range(2,5)
>>> [([int(i),int(m)]) for m in j for i in j if int(i) % int(m) == 0 and int(i) != int(m)]
[[4, 2]]
答案 1 :(得分:0)
您可以使用 itertools.product
http://docs.python.org/library/itertools.html#itertools.product
示例
for var1, var2 in itertools.product(xrange(min1, max1, step1), xrange(min2, max2, step2)):
# stuff
答案 2 :(得分:0)
让我们使用itertool combinaison并过滤
分两行:
from itertools import combinations
alist =[(x,y) if (x%y==0 or y%x==0 and x!=y ) else None for x,y in combinations(l, 2)]
L = list(filter(None, alist))
答案 3 :(得分:0)
使用itertools.product
。请注意,将int
映射到原始输入列表上一次比较简单,而不是不断地转换单个元素。
from itertools import product
def find_divisible(j):
return [(i, m) for (i, m) in product(map(int, j), repeat=2)
if i % m == 0 and i != m]