2

Pythonのforループは、リストから「0」を繰り返し処理していません。

入力を数字と文字(または演算子)に分けるコードを作成しようとしました:

g='10+10+20x'

t=[]
for each_g in g:
    t.append(each_g)

lol=[]
a=[]
for each_t in t:
    if each_t.isdigit():
        lol.append(each_t)
        x = t.index(each_t)
        t.pop(x)
    else:
        lol = ''.join(lol)
        a.append(lol)
        a.append(each_t)
        lol=[]
print(a)

必要な出力は次のとおりです。

['10', '+', '10', '+', '20', 'x']

しかし、それは印刷します

['1', '+', '1', '+', '2', 'x']

代わりは。

コードに問題がありますか、それとも期待どおりに機能させるためのより良い解決策がありますか?

ありがとう。

4

3 に答える 3

8

繰り返し処理しているシーケンスを変更しないでください。popあなたがそれを処理することができる前に、それぞれはキャラクターを下にシフトしています。

この場合、使いt終わったら使用していないので、まったく必要ありませんpop。冗長です。

于 2013-01-31T23:40:39.403 に答える
3

別のアプローチは次のとおりです(コードはすでに他の人によって徹底的に議論されているため):

In [38]: import re

In [39]: g='10+10+20x'

In [40]: re.findall('(\d+|[a-zA-Z]+|\+)',g)
Out[40]: ['10', '+', '10', '+', '20', 'x']
于 2013-01-31T23:46:03.997 に答える
1

リストを繰り返し処理しているときにリスト(またはその他の繰り返し可能なもの)を編集するのは恐ろしい考えです。

リストの反復は次のように機能します。

あなたが言うときfor each_t in t、実際に起こっていることは、数列が順番に生成されるということです。最初0に、次に1、というように、までlen(t)-1。次に、イテレータはそのインデックスの要素を取得し、それをに割り当てますeach_t

そのリストからポップすると、インデックスが削除されます。したがって、以前はインデックス3にあったものが、現在はインデックス2にあります(3未満のインデックスで何かをポップした場合)。次に、イテレータが次の番号の要素にアクセスします。ただし、要素は基本的にインデックスを下にシフトしているため、イテレータがインデックスの要素を要求すると、「以前はインデックスiにあった要素を教えてください」という意味になりますi。代わりに、「現在インデックスiにある要素、実際にはインデックスにあった要素」が取得されますi+1

これが、リストを繰り返し処理するときにリストから削除するときに要素をスキップする理由です。

于 2013-01-31T23:46:40.470 に答える