从传统循环到列表理解
From traditional loop to list comprehension
我正在应对一项挑战,我想将我的代码(有效)转换为更高效的代码。给定一个数字 prod(对于产品),我们搜索两个斐波那契数 F(n)
和 F(n+1)
验证是否 F(n) * F(n+1) = prod
。
这是我的原始代码
def productFib(prod):
fibonacci_numbers = [0, 1]
for i in range(2,prod+1):
fibonacci_numbers.append(fibonacci_numbers[i-1]+fibonacci_numbers[i-2])
pairing = [[fibonacci_numbers[i], fibonacci_numbers[i+1]] for i in range((len(fibonacci_numbers)-1))]
for ind, pair in enumerate(pairing):
if pair[0]*pair[1] ==prod:
ans=[pair[0], pair[1], True]
return ans
elif all(pair[0]*pair[1] !=prod for pair in pairing)==True:
match=next(x for x in pairing if x[0]*x[1]>prod)
ans=[match[0], match[1], False]
return ans
break
def productFib(prod):
fibonacci_numbers = [0, 1]
for i in range(2, prod+1):
fibonacci_numbers.append(fibonacci_numbers[i-1]+fibonacci_numbers[i-2])
pairing = [[fibonacci_numbers[i], fibonacci_numbers[i+1], True] if [fibonacci_numbers[i]*fibonacci_numbers[i+1]]==prod \
else [next(fibonacci_numbers[n] for n in range(len(fibonacci_numbers)-1) if fibonacci_numbers[n]*fibonacci_numbers[n+1]>prod), next(fibonacci_numbers[n+1] for n in range(len(fibonacci_numbers)-1) if fibonacci_numbers[n]*fibonacci_numbers[n+1]>prod) , False] if all(fibonacci_numbers[i]*fibonacci_numbers[i+1] !=prod) ==True \
for i in range((len(fibonacci_numbers)-1))]
return pairing
我希望它 return:
[F(n), F(n+1), true] or [F(n), F(n+1), false]
根据一个数字 prod(对于产品),我们搜索两个斐波那契数 F(n) 和 F(n+1) 验证 -> F(n) * F(n+1) = prod
通常,有一些方法可以简化问题:
- 另一种更简单高效的方式
- 更多 pythonic 风格
F(n) * F(n+1) = prod,n的个数不超过1。我觉得你的想法没问题,你可以生成你的fib列表,同时判断f(n) * f(n+1) = prob,也许你的代码可以更简单
prod = 50 # random value for your product
top_limit = int(prod ** 0.5) # you should set a suitable top limit
def fib(top):
n, a, b = 0, 0, 1
while n < top:
a, b = b, a + b
if a * b == prod:
yield [a,b,True]
else:
yield [a,b,False]
n = n + 1
list(fib(top_limit))
输出为
[[1, 1, False],
[1, 2, False],
[2, 3, False],
[3, 5, False],
[5, 8, False],
[8, 13, False],
[13, 21, False]]
你看,13 * 21 = 273 >> 50,你可以把变量top_limit
设得更小
我相信这次返工模仿了您的原始代码,但要简单得多:
def productFib(target):
fibonacci = [0, 1]
while True:
product = fibonacci[0] * fibonacci[1]
if product >= target:
return fibonacci + [product == target]
fibonacci[:] = fibonacci[1], sum(fibonacci)
print(productFib(272))
print(productFib(273))
print(productFib(274))
输出
> python3 test.py
[13, 21, False]
[13, 21, True]
[21, 34, False]
>
您暗示了两个目标:"more efficient" 和 "list comprehension" -- 我选择了 "more efficient"。
我正在应对一项挑战,我想将我的代码(有效)转换为更高效的代码。给定一个数字 prod(对于产品),我们搜索两个斐波那契数 F(n)
和 F(n+1)
验证是否 F(n) * F(n+1) = prod
。
这是我的原始代码
def productFib(prod):
fibonacci_numbers = [0, 1]
for i in range(2,prod+1):
fibonacci_numbers.append(fibonacci_numbers[i-1]+fibonacci_numbers[i-2])
pairing = [[fibonacci_numbers[i], fibonacci_numbers[i+1]] for i in range((len(fibonacci_numbers)-1))]
for ind, pair in enumerate(pairing):
if pair[0]*pair[1] ==prod:
ans=[pair[0], pair[1], True]
return ans
elif all(pair[0]*pair[1] !=prod for pair in pairing)==True:
match=next(x for x in pairing if x[0]*x[1]>prod)
ans=[match[0], match[1], False]
return ans
break
def productFib(prod):
fibonacci_numbers = [0, 1]
for i in range(2, prod+1):
fibonacci_numbers.append(fibonacci_numbers[i-1]+fibonacci_numbers[i-2])
pairing = [[fibonacci_numbers[i], fibonacci_numbers[i+1], True] if [fibonacci_numbers[i]*fibonacci_numbers[i+1]]==prod \
else [next(fibonacci_numbers[n] for n in range(len(fibonacci_numbers)-1) if fibonacci_numbers[n]*fibonacci_numbers[n+1]>prod), next(fibonacci_numbers[n+1] for n in range(len(fibonacci_numbers)-1) if fibonacci_numbers[n]*fibonacci_numbers[n+1]>prod) , False] if all(fibonacci_numbers[i]*fibonacci_numbers[i+1] !=prod) ==True \
for i in range((len(fibonacci_numbers)-1))]
return pairing
我希望它 return:
[F(n), F(n+1), true] or [F(n), F(n+1), false]
根据一个数字 prod(对于产品),我们搜索两个斐波那契数 F(n) 和 F(n+1) 验证 -> F(n) * F(n+1) = prod
通常,有一些方法可以简化问题:
- 另一种更简单高效的方式
- 更多 pythonic 风格
F(n) * F(n+1) = prod,n的个数不超过1。我觉得你的想法没问题,你可以生成你的fib列表,同时判断f(n) * f(n+1) = prob,也许你的代码可以更简单
prod = 50 # random value for your product
top_limit = int(prod ** 0.5) # you should set a suitable top limit
def fib(top):
n, a, b = 0, 0, 1
while n < top:
a, b = b, a + b
if a * b == prod:
yield [a,b,True]
else:
yield [a,b,False]
n = n + 1
list(fib(top_limit))
输出为
[[1, 1, False],
[1, 2, False],
[2, 3, False],
[3, 5, False],
[5, 8, False],
[8, 13, False],
[13, 21, False]]
你看,13 * 21 = 273 >> 50,你可以把变量top_limit
设得更小
我相信这次返工模仿了您的原始代码,但要简单得多:
def productFib(target):
fibonacci = [0, 1]
while True:
product = fibonacci[0] * fibonacci[1]
if product >= target:
return fibonacci + [product == target]
fibonacci[:] = fibonacci[1], sum(fibonacci)
print(productFib(272))
print(productFib(273))
print(productFib(274))
输出
> python3 test.py
[13, 21, False]
[13, 21, True]
[21, 34, False]
>
您暗示了两个目标:"more efficient" 和 "list comprehension" -- 我选择了 "more efficient"。