-2

文字列内の値を検出し、それに基づいて新しい値を作成しようとしています。コードを示すために簡単なモデルを作成しました。問題は、実行するとすぐにクラッシュするのはなぜですか?

objekt = raw_input("Write a binary string: ")

nyfil = ""


count = 0

print objekt[count:2]

while count != len(objekt):
    if objekt[count:2] == "00":
        nyfil = nyfil + "0"
    elif objekt[count:2] == "11":
        nyfil += "1"
    elif objekt[count:2] == "01":
        nyfil += "L"
    elif objekt[count:2] == "10":
        nyfil += "C"
    else:
        pass
    count += 2

print nyfil
4

3 に答える 3

2

count2ずつ増加していますが、 ( ではなく) ループ内!=で比較を行っています。したがって、長さが不均一な場合、ループを永久に実行することになります (たとえば、3 ですが、count は 0、2、4、... の値しか取りません)。while<objektlen(object)

于 2013-09-28T14:39:18.730 に答える
1
objekt[count:2]

これは、増加すると、count期待どおりに機能しません。これを参照してください:

>>> s = '0123456789'
>>> s[0:2]
'01'
>>> s[1:2]
'1'
>>> s[2:2]
''
>>> s[3:2]
''
>>> s[2:4]
'23'
>>> s[4:6]
'45'

さらに、 のようなループ条件にも注意する必要がありますcount != len(objekt)。の長さobjektが不均一な場合、2 ずつインクリメントしてもループから抜け出すことはできませんcount。もちろん、ユーザーが偶数の文字列を入力することを期待していますが、そうでない可能性はほとんどありません。より安全な条件はcount < len(objekt).

そのため、while ループは次のようになります。

while count < len(objekt):
    if objekt[count:count+2] == "00":
        nyfil = nyfil + "0"
    elif objekt[count:count+2] == "11":
        nyfil += "1"
    elif objekt[count:count+2] == "01":
        nyfil += "L"
    elif objekt[count:count+2] == "10":
        nyfil += "C"
    else:
        pass
    count += 2

少し簡単にするためobjekt[count:count+2]に、別の変数に格納できるので、チェックごとに計算する必要はありません。else: pass文字通り何もしないので、その部分を取り除くこともできます:

while count < len(objekt):
    part = objekt[count:count+2]
    if part == "00":
        nyfil = nyfil + "0"
    elif part == "11":
        nyfil += "1"
    elif part == "01":
        nyfil += "L"
    elif part == "10":
        nyfil += "C"
    count += 2
于 2013-09-28T14:44:00.220 に答える
0

あなたが抱えている主な問題は、リストを 2 秒ずつ進めようとしているのに、カウントが正しくインクリメントされていないことです。

リストを 2 ずつ進めるには、次のようにします。

>>> i = '12345678'
>>> for pairs in zip(i[0::2], i[1::2]):
...     print pairs
...
('1', '2')
('3', '4')
('5', '6')
('7', '8')

このバージョンでは、ルックアップ辞書と共にそのループを使用して、結果の文字列を作成します。

d = {'00': '0', '11': '1', '01': 'L', '10': 'C'}

i = raw_input('Enter your string: ')
print ''.join(d.get(''.join(k), ''.join(k)) for k in zip(i[0::2], i[1::2]))
于 2013-09-28T14:43:10.757 に答える