检查是否可以将列表分成2,其中包含数字的精确总和

时间:2018-01-31 09:15:58

标签: python python-3.x algorithm list

我的问题是我有一个列表,例如

l =[1, 2, 3, 4, 5, 15]

我希望将它分成两个列表,list1将具有实际列表中的单个元素,该列表应该是列表中所有其他数字的总和,而list2包含rest。因此,如果可能,则输出为([1, 2, 3, 4, 5], [15]),返回False

7 个答案:

答案 0 :(得分:2)

这是一种方式,但不一定是最佳方式。它使用了我认为未充分利用的for...else...构造。

我还reversed range迭代器。在您提供的情况下,这会更有效。

l = [1, 2, 3, 4, 5, 15]

def splitter(l):
    for i in reversed(range(len(l))):
        if sum(l[:i]) == sum(l[i:]):
            return [l[:i], l[i:]]
    else:
        return False

splitter(l)  # [[1, 2, 3, 4, 5], [15]]

答案 1 :(得分:1)

值列表中是否可以更改值的位置?如果没有,你可以尝试迭代,如:

l = [1, 2, 3, 4, 5, 15]
dividable = "False"
x = 0

while dividable == "False":
    l1 = l[0:x]
    l2 = l[x:len(l)]
    if sum(l1) == sum(l2):
        dividable = "True"
    elif x == len(l):
        #not possible
        break
    else:
        x += 1

答案 2 :(得分:1)

这个答案在所有情况下都应该有所帮助。 无需导入,也无需对数据进行排序。

def split_list(l):
     dividable=False
     index=0
     for i in range(len(l)):
         if l[i]==sum(l)-l[i]:
             dividable=True
             index=i
             break
     if dividable:
         l1=l[index]
         l.remove(l[index])
         return (l1,l)
     else:
         return False

可能不是优化的方式,而是一种更好,更清晰的方式来理解初学者。

  

split_list([1,2,3,4,5,15])

     

[15],[1,2,3,4,5]

希望这会有所帮助。感谢

答案 3 :(得分:1)

这是怎么回事?

l =[1, 2, 3, 4, 5, 15]
l=sorted(l)
track=[]
for i in l:
    track.append(i)
    if sum(track) in l and len(track)==len(l[1:]):
        print(track,[sum(track)])

输出:

[1, 2, 3, 4, 5], [15]

答案 4 :(得分:0)

您需要执行以下几个步骤:

1)将列表从小到大排序。 (如果你不想改变原文,请进入新名单)

2)对列表中的每个其他元素求和,看它是否相等。

3)如果false返回false

4)如果是的话:

将最后一个(最大)值存储在变量中,并从原始列表的副本中删除它。

制作第二个列表,其中只包含最后一个值。

创建另一个新列表并添加更改后的重复列表和由最大元素组成的列表。

返回最后创建的列表。

然后你就完成了

答案 5 :(得分:0)

使用numpy

def split(l):
    c = np.cumsum(l)
    idx = np.flatnonzero(np.equal(l, c[-1] / 2.0))
    return (l[:idx[0]], l[idx[0]:]) if idx.size > 0 else False

或者,如果使用Python> 3.2:

import itertools
def split(l):
    c = list(itertools.accumulate(l))
    h = c[-1] / 2.0
    if h in c:
        i = l.index(h)
        return l[:i], l[i:]
    return False

最后,如果你想使用“纯”Python(没有导入):

def split(l):
    c = [sum(l[:k]) for k in range(1, len(l) + 1)]
    h = c[-1] / 2.0
    if h in c:
        i = l.index(h)
        return l[:i], l[i:]
    return False

答案 6 :(得分:0)

蛮力:

import itertools

x = [1, 2, 3, 4, 5, 15]

for size in range(1,len(x)):
    for sublist in itertools.combinations(x, size):
        comp = x[:]
        for n in sublist:
            comp.remove(n)

        if sum(comp) == sum(sublist):
            print(comp, sublist)
  

[1,2,3,4,5](15,)
  [15](1,2,3,4,5)

这种方法可以处理重复的数字。