Python 二和问题实现中的索引器

Python 二和问题实现中的索引器,python,algorithm,Python,Algorithm,我编写了一个算法,将列表中的两个数字相加,使之等于15、13或7,然后从原始列表中删除这些数字,然后重复这个过程。直到开始列表中没有更多或更少的数字。始终存在以下问题:索引器错误:列表分配索引超出范围 我试着使用字典或者找到另一种算法,因为我现在做的是一种蛮力。但这是徒劳的 number=[10,5,14,1,12,2,7,6,10,3,8] 案例1=15 案例2=13 lc1i=[] lc1j=[] lc2i=[] lc2j=[] def分离(编号、案例1、案例2): 就我而言,数字如下: 对

我编写了一个算法,将列表中的两个数字相加,使之等于15、13或7,然后从原始列表中删除这些数字,然后重复这个过程。直到开始列表中没有更多或更少的数字。始终存在以下问题:索引器错误:列表分配索引超出范围

我试着使用字典或者找到另一种算法,因为我现在做的是一种蛮力。但这是徒劳的

number=[10,5,14,1,12,2,7,6,10,3,8]
案例1=15
案例2=13
lc1i=[]
lc1j=[]
lc2i=[]
lc2j=[]
def分离(编号、案例1、案例2):
就我而言,数字如下:
对于j的数量:
如果i+j==情况1:
立法会一题:附加(i)
del编号[i]
立法会一题:附加(j)
del编号[j]
elif i+j==情况2:
立法会二题:附加(i)
del编号[i]
立法会二题:附加(j)
del编号[j]
打印(数字)
单独(编号、案例1、案例2)
我希望最后会有两个不同的字典:第一个是所有对的字典,总共15个,另一个是所有对的字典,总共13个。
但是我有这样一条信息:indexer-ror:list-assignment-index超出范围

在评论中已经指出了很多好的东西,只想补充几点。如果您想坚持当前所做的,您可以做的是维护一个已处理索引的
列表
,而不是直接从原始
列表
中删除项目,只需检查当前索引是否已处理(通过在列表中执行
项目
)。大概是这样的:

number=[10,5,14,1,12,2,7,6,10,3,8]
案例1=15
案例2=13
lc1i=[]
lc1j=[]
lc2i=[]
lc2j=[]
#我们将存储已处理的索引,以确保不会再次处理它们
已处理\u索引=[]
def分离(编号、案例1、案例2):
对于idx1,枚举中的i(编号):
对于idx2,枚举中的j(数字):
#检查是否已处理索引
如果已处理索引中的idx1或已处理索引中的idx2:
持续
如果i+j==情况1:
立法会一题:附加(i)
已处理索引。追加(idx1)
立法会一题:附加(j)
已处理索引。追加(idx2)
elif i+j==情况2:
立法会二题:附加(i)
已处理索引。追加(idx1)
立法会二题:附加(j)
已处理索引。追加(idx2)
打印(数字)
单独(编号、案例1、案例2)

评论中已经指出了很多好东西,只想补充几点。如果您想坚持当前所做的,您可以做的是维护一个已处理索引的
列表
,而不是直接从原始
列表
中删除项目,只需检查当前索引是否已处理(通过在列表中执行
项目
)。大概是这样的:

number=[10,5,14,1,12,2,7,6,10,3,8]
案例1=15
案例2=13
lc1i=[]
lc1j=[]
lc2i=[]
lc2j=[]
#我们将存储已处理的索引,以确保不会再次处理它们
已处理\u索引=[]
def分离(编号、案例1、案例2):
对于idx1,枚举中的i(编号):
对于idx2,枚举中的j(数字):
#检查是否已处理索引
如果已处理索引中的idx1或已处理索引中的idx2:
持续
如果i+j==情况1:
立法会一题:附加(i)
已处理索引。追加(idx1)
立法会一题:附加(j)
已处理索引。追加(idx2)
elif i+j==情况2:
立法会二题:附加(i)
已处理索引。追加(idx1)
立法会二题:附加(j)
已处理索引。追加(idx2)
打印(数字)
单独(编号、案例1、案例2)

不要使用列表如果顺序不重要,请使用集合

number = [10,5,14,1,12,2,7,6,10,3,8]
case1=15
case2=13

result1 = {0}
result2 = {0}

def seperate(number,case1,case2):

    for i in number:
        for j in number:
            if i+j == case1:
                result1.add(i)
            elif i+j == case2:
                result2.add(i)
    print(result1)
    print(result2)


seperate(number,case1,case2)

不要使用列表如果顺序不重要,请使用集合

number = [10,5,14,1,12,2,7,6,10,3,8]
case1=15
case2=13

result1 = {0}
result2 = {0}

def seperate(number,case1,case2):

    for i in number:
        for j in number:
            if i+j == case1:
                result1.add(i)
            elif i+j == case2:
                result2.add(i)
    print(result1)
    print(result2)


seperate(number,case1,case2)

已经有一些答案(甚至是一个被接受的答案),但似乎没有一个考虑到问题的要求:

我希望最后会有两个不同的字典:第一个是所有对的字典,共15个,另一个是所有对的字典,共13个

(注意:我假设“列表”是指“字典”,因为字典在这种情况下没有意义,示例代码也适用于列表。)

此外,我假设同一个数字不能使用两次。对于给定的示例情况,这并不重要,因为15、13和7是奇数,向其自身添加整数不会导致奇数。然而,在一般情况下,这可能很重要

下面是我的解决方案,它

  • …可处理任意数量的案件,如问题中所述的“15或13或7”。函数接受案例列表,而不是两个案例
  • …返回每种情况的索引对列表(因此返回值是索引元组列表,但听起来比实际情况更糟…)
  • …已更新,以解决许多
    pylint
    警告,并符合PEP8样式指南。它还打印结果以供演示
免责声明:我不完全清楚所有数字是否只能使用一次,或者是否适用于所有情况。因此,如果10和5是一对,加起来等于15,那么10和3也是一对,等于13,或者10只能使用一次?如果我误解了这个问题,请让我知道,这样我可以更新代码

代码

number=[10,5,14,1,12,2,7,6,10,3,8]
案例=[15,13,7]
def单独(数量、箱数):
结果=[]
在下列情况下:
结果=[]
剩余索引=列表