如何在while循环中修复索引错误(列表)如果它只出现在while循环中

2024-10-08 18:22:05 发布

您现在位置:Python中文网/ 问答频道 /正文

我的问题是,我有一个数字列表,如果试图将列表中的每个元素保存在一个变量中以拆分它们,那么我得到的错误列表索引超出了范围。但如果我尝试whithoul和wihle loup,并对列表中的2或3个元素手动执行,它就可以工作了。你知道吗

我在stackoverflow和reddit上尝试了很多不同的可能性,但是northing成功了。你知道吗

import itertools
from itertools import combinations
from itertools import permutations
from itertools import combinations_with_replacement

f = 2, 'f'
u = 3, 'u'
th = 5, 'th'
o = 7, 'o'
r = 11, 'r'
c = 13, 'c/k'
g = 17, 'g'
w = 19, 'w'
h = 23, 'h'
n = 29, '29'
i = 31, 'i'
j = 37, 'j'
s = 53, 's/z'
t = 59, 't'
b = 61, 'b'
e = 67, 'e'
m = 71, 'm'
l = 73, 'l'
ng = 79, 'ng/ing'
oe = 83, 'oe'
d = 89, 'd'
a = 97, 'a'
ae = 101, 'ae'
y = 103, 'y'
eo = 41, 'eo'
p = 43, 'p'
x = 47, 'x'
ia = 107, 'ia,io'
ea = 109, 'ea'


runen = [f, u, th, o, r, c, g, w, h, n, i, j, s, t, b, e, m, l, ng, oe, d, a, ae, y, eo, p, x, ia, ea]

runen1 = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101, 103, 43, 47, 107, 109]
kek = list(combinations(runen1, 2))
zero = 0
null = 0
while(zero < len(kek)):
    jayjay = kek[null]
    jayjay1 = jayjay.replace(',', '')
    jayjay1 = jayjay.replace("'", '')
    jayjay1 = jayjay.replace('(', '')
    jayjay1 = jayjay.replace(')', '')
    jayjay1 = jayjay.replace(' ', '')
    newlist = []
    newlist.append(jayjay)
    del kek[null]
    null = null +1

print(newlist)

我将新列表导出为输出 但是输出是错误的:列表索引超出范围


Tags: fromimport列表eongnullreplaceoe
2条回答

首先,这需要一些mod来重现您的错误:

from itertools import combinations #### Added ####
runen1 = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101, 103, 43, 47, 107, 109]
kek = list(combinations(runen1, 2))
zero = 0
null = 0
while(zero < len(kek)):
    jayjay = str(kek[null]) #### Added ####
    jayjay1 = jayjay.replace(',', '')
    jayjay1 = jayjay.replace("'", '')
    jayjay1 = jayjay.replace('(', '')
    jayjay1 = jayjay.replace(')', '')
    jayjay1 = jayjay.replace(' ', '')
    newlist = []
    newlist.append(jayjay)
    del kek[null]
    null = null +1

print(newlist)

经过这些修改后,我得到:

Traceback (most recent call last):
  File "stacktest.py", line 7, in <module>
    jayjay = str(kek[null]) #### Added ####
IndexError: list index out of range

你为什么越界?好吧,您正在访问kek[null],但是while循环正在检查的条件是zero < len(kek)。这些不一样。你知道吗

其次,您几乎从不需要在Python中使用索引。它不像C,索引是完成迭代的唯一方法。如果要迭代,可以执行以下操作:

for item in kek:
    print(item)
    # or do more complex things with item

第三,您不想在循环期间重新初始化newlist = []。把它放在圈外。你知道吗

第四,不要对正在迭代的内容调用del。你知道吗

第五,不需要jayjay1,只需在适当的地方修改jayjay。你知道吗

综合起来:

from itertools import combinations
runen1 = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101, 103, 43, 47, 107, 109]
kek = list(combinations(runen1, 2))
newlist = []
for jayjay_tuple in kek:
    jayjay = str(jayjay_tuple)
    jayjay = jayjay.replace(',', '')
    jayjay = jayjay.replace("'", '')
    jayjay = jayjay.replace('(', '')
    jayjay = jayjay.replace(')', '')
    jayjay = jayjay.replace(' ', '')
    newlist.append(jayjay)

print(newlist)

这与您的(原始)代码很接近,如果您增加了组合的数量,它也会起作用。你知道吗

如果你对编程很认真的话,学会调试是一项非常宝贵的技能。我强烈建议您阅读https://ericlippert.com/2014/03/05/how-to-debug-small-programs/,并学习使用pdbimport pdb; pdb.set_trace())。错误会不断出现,而且你不想每次都发邮件。你知道吗

嗯。你知道吗

你把事情弄得太复杂了。使用列表理解:

import itertools
runen1 = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101, 103, 43, 47, 107, 109]
newlist = [int(str(a) + str(b)) for a,b in itertools.combinations(runen1,2)]

如果你想从2推广。您可以使用:

def kspots(nums,k):
    return [int(''.join(str(a) for a in c)) for c in itertools.combinations(nums,k)]

然后,例如,kspots(runen1,17)将是您似乎想要的(大)列表。这个列表有21474180个元素,在我的机器上生成要花一分钟的时间,所以您可能希望使用生成器表达式而不是列表理解(用(,)替换外部的[,]

相关问题 更多 >

    热门问题