ここには実際には 2 つの問題があります。
まず、Mike が指摘したように、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 です。では、13 の場合はどうなるn
でしょうか。は明らかn < 13 or n < 17
に正しいので、次の行に移動してstring1[n]
.
を に変更して修正できor
ますand
。
しかし実際には、そもそも間違いにくいコードを書いたほうがよいのです。
まず、これを行うことができます:
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]
しかし、現時点では、エラーの可能性を排除していません。