这里实际上有两个问题。
首先,正如迈克所指出的,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。那么,当n
13 时会发生什么?嗯,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]
但在这一点上,我们并没有消除出错的机会。