これは実際には本当に単純なリスト内包表記です:
>>> text = '000 001 002 003 '
>>> words = ['foo', 'bar', 'that', 'these']
>>> [words[int(item)] for item in text.split()]
['foo', 'bar', 'that', 'these']
編集:他の値をそのままにしておく必要がある場合は、次のことに対応できます。
def get(seq, item):
try:
return seq[int(item)]
except ValueError:
return item
次に、次のようなものを使用します。当然、文字列に誤って置き換えられる可能性のある他の数字がある場合[get(words, item) for item in text.split()]
は、さらにテストが必要になる可能性があります。get()
(編集終了)
私たちが行うことは、テキストを個々の数字に分割し、それらを整数に変換し、それらを使用して、単語を見つけるために指定したリストにインデックスを付けることです。
コードが機能しない理由については、主な問題は文字列をループしていることです。これにより、単語ではなく文字が表示されます。ただし、これはタスクを解決するための優れた方法ではありません。
また、値をループしてインデックスをそれらに合わせたい場合は、カウント変数を使用するのではなく、enumerate()
組み込みを使用する必要があることにも注意してください。
例:代わりに:
y = -1
for w in text:
y = y + 1
...
使用する:
for y, w in enumerate(text):
...
これははるかに読みやすく、Pythonicです。
既存のコードのもう1つの点は、次のとおりです。
w = {x:a}
for i, j in w.iteritems():
text = text.replace(i, j)
あなたがそれについて考えるならば、それは以下に単純化されます:
text = text.replace(x, a)
1つのアイテムの辞書に設定w
し、それをループしますが、1つのアイテムしか含まれないことがわかります。
あなたの方法にもっと厳密に従う解決策は次のようになります:
words_dict = {"{0:03d}".format(index): value for index, value in enumerate(words)}
for key, value in words_dict.items():
text = test.replace(key, value)
ゼロが埋め込まれた数値文字列(を使用str.format()
)から値までの辞書を作成し、アイテムごとに置き換えます。2.xを使用しているので、が必要になることに注意してください。2.7よりdict.iteritems()
前の場合は、dict()
dict内包表記が存在しないため、タプルのジェネレーターに組み込まれているものを使用してください。