簡體   English   中英

在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個案例:

  1. 如果所需的總和n為零,則實現目標。
  2. 如果我們可以在刪除第一個項目后獲得剩余項目的總和,那么就可以實現目標。
  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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM