次のステートメントを 1 行で記述できるかどうかを知りたいです。
new = ''
for char in text:
if char in blacklist:
new += ' '
else:
new += char
試しましたが、構文エラーが発生します:
new = ''.join(c for c in text if c not in blacklist else ' ')
私はそれが可能かどうかを知りたいだけです。
次のステートメントを 1 行で記述できるかどうかを知りたいです。
new = ''
for char in text:
if char in blacklist:
new += ' '
else:
new += char
試しましたが、構文エラーが発生します:
new = ''.join(c for c in text if c not in blacklist else ' ')
私はそれが可能かどうかを知りたいだけです。
それを繰り返すのは、非常に複雑な方法のように思えます。正規表現を使用しないのはなぜですか?
import re
blacklist = re.compile(r'[xyz]') # Blacklist the characters 'x', 'y', 'z'
new = re.sub(blacklist, ' ', text)
インライン条件を間違った場所で使用しています (そこに条件がなくても機能しますelse ' '
。その場合、イテラブルのフィルターになるだけです)。そのままでは、次のようにします。
new = ''.join(c if c not in blacklist else ' ' for c in text)
必要に応じて、次のようにすることもできます。
new = ''.join(' ' if c in blacklist else c for c in text)
あなたはほとんどそれを持っていました:
''.join(c if c not in blacklist else ' ' for c in text)
はそれ自体が表現なので、途中でX if Y else Z
分けることはできません。for c in text
str の translate メソッドを使用します。ブラックリストの文字の代わりに ' ' を使用して、ホワイトリストの文字列を作成します。
>>> table = ''.join(c if c not in 'axy' else ' ' for c in map(chr,range(256)))
次に、次のテーブルで translate を呼び出します。
>>> 'xyzzy'.translate(table)
' zz '