[英]For loops not functioning as I intended. (looping through txt files in python)
[英]looping through loops in python?
我試圖在coderbyte的簡單部分解決這個問題,提示是:
讓函數ArrayAdditionI(arr)獲取存儲在arr中的數字數組,如果數組中的任何數字組合可以添加到數組中的最大數字,則返回字符串true,否則返回字符串false。 例如:如果arr包含[4,6,23,10,1,3],則輸出應返回true,因為4 + 6 + 10 + 3 = 23.數組不會為空,不包含所有相同的元素,並且可能包含負數。
這是我的解決方案。
def ArrayAddition(arr):
arr = sorted(arr, reverse=True)
large = arr.pop(0)
storage = 0
placeholder = 0
for r in range(len(arr)):
for n in arr:
if n + storage == large: return True
elif n + storage < large: storage += n
else: continue
storage = 0
if placeholder == 0: placeholder = arr.pop(0)
else: arr.append(placeholder); placeholder = arr.pop(0)
return False
print ArrayAddition([2,95,96,97,98,99,100])
我甚至不確定這是否正確,但它似乎涵蓋了我插入的所有數字。我想知道是否有更好的方法通過我不知道的算法來解決這個問題。 我正在考慮for for for for for,et循環可以解決問題,但我不知道如何做到這一點。
我的想法是用A + B,A + C,A + D ... A + B + C ...... A + B + C + D + E來實現這一目標
例如)
for i in range(len(arr):
print "III: III{}III".format(i)
storage = []
for j in range(len(arr):
print "JJ: II({}),JJ({})".format(i,j)
for k in range(len(arr):
print "K: I{}, J{}, K{}".format(i,j,k)
我已經搜遍了所有的並發現了itertool的建議,但是我想知道是否有辦法更加原始地編寫這個代碼。
謝謝。
遞歸解決方案:
def GetSum(n, arr):
if len(arr) == 0 and n != 0:
return False
return (n == 0 or
GetSum(n, arr[1:]) or
GetSum(n-arr[0], arr[1:]))
def ArrayAddition(arr):
arrs = sorted(arr)
return GetSum(arrs[-1], arrs[:-1])
print ArrayAddition([2,95,96,97,98,99,100])
當所需的總和不為零且數組中沒有項時,GetSum函數返回False。 然后檢查3個案例:
您的解決方案不起作用。
>>> ArrayAddition([10, 11, 20, 21, 30, 31, 60])
False
簡單的解決方案是使用itertools
迭代輸入的所有子集(不包含最大數字):
def subsetsum(l):
l = list(l)
target = max(l)
l.remove(l)
for subset_size in xrange(1+len(l)):
for subset in itertools.combinations(l, subset_size):
if sum(subset) == target:
return True
return False
如果要避免使用itertools,則需要直接生成子集。 這可以通過以二進制計數並使用設置位來確定要選擇的元素來實現:
def subsetsum(l):
l = list(l)
target = max(l)
l.remove(l)
for subset_index in xrange(2**len(l)):
subtotal = 0
for i, num in enumerate(l):
# If bit i is set in subset_index
if subset_index & (1 << i):
subtotal += num
if subtotal == target:
return True
return False
更新:我忘了你要檢查所有可能的組合。 請改用:
def ArrayAddition(l):
for length in range(2, len(l)):
for lst in itertools.combinations(l, length):
if sum(lst) in l:
print(lst, sum(lst))
return True
return False
單線解決方案:
>>> any(any(sum(lst) in l for lst in itertools.combinations(l, length)) for length in range(2, len(l)))
希望這可以幫助!
生成powerset的所有總和並針對最大值測試它們
def ArrayAddition(L):
return any(sum(k for j,k in enumerate(L) if 1<<j&i)==max(L) for i in range(1<<len(L)))
您可以通過執行一些預處理來改善這一點 - 首先找到最大值並將其從L中刪除
還有一種方法......
碼:
import itertools
def func(l):
m = max(l)
rem = [itertools.combinations([x for x in l if not x == m],i) for i in range(2,len(l)-1)]
print [item for i in rem for item in i if sum(item)==m ]
if __name__=='__main__':
func([1,2,3,4,5])
輸出:
[(1, 4), (2, 3)]
希望這可以幫助.. :)
如果我正確地理解了這個問題,那么這應該返回你想要的東西:
2*max(a)<=sum(a)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.