这里实际上有两个问题。
首先,正如迈克所指出的,n < len(string1) or len(string2)相当于(n < len(string)) or len(string2). 换句话说,只要len(string2)不为零,这将始终为真。要解决此问题,请将其更改为n < len(string1) or n < len(string2).
但是当你解决这个问题时,什么都不会改变;你仍然会得到一个IndexError. 这里的问题是,你不仅没有正确地实现你的逻辑,而且逻辑首先是错误的。len(string1)是 13,len(string2)是 17。那么,当n13 时会发生什么?嗯,n < 13 or n < 17显然是真的,所以你仍然要点击下一行并尝试做string1[n].
您可以将其更改or为 anand来解决此问题。
但实际上,最好编写一开始就更难出错的代码。
首先,您可以这样做:
while n < min(len(string1), len(string2)):
其次,每当你编写一个以 开头的循环,在 上n = 0执行一个while循环n < <something>,然后在执行一个n += 1时,你可以并且应该将它重写为for一个范围上的循环:
for n in range(min(len(string1), len(string2))):
同时,如果您考虑一下,我认为如果string2短于string1. 所以真的,你想要的是:
for n in range(len(string1)):
每当你发现自己在循环range(len(<something>)),然后在<something[n]>循环内做,你真的只想<something>直接循环:
for ch in string1:
让我们把它放在一起:
string1 = "doesnt matter"
string2 = "doesnt matter too"
listt = []
for ch in string1:
if ch in string2:
listt.append(ch)
这更具可读性——更重要的是,对于新手来说,更难出错。即使是有经验的程序员也经常<在他们应该使用的时候使用<=,或者在复杂的if语句中弄错括号等。但是如果你一开始就不必编写那个逻辑,你就不会犯那些错误。
事实上,你可以更进一步,因为这种模式正是列表推导所做的(或者,filter函数),所以:
string1 = "doesnt matter"
string2 = "doesnt matter too"
listt = [ch for ch in string1 if ch in string2]
但在这一点上,我们并没有消除出错的机会。