2016-05-13 30 views
4

次のコードスニペットを検討してください。これは、breakステートメントで構文エラーのフラグを立てます。pythonで三項演算子を使用していますか?

digits = list(str(102)) 
dummy = list(str(102/2)) 
for j in digits: 
    dummy.remove(j) if j in dummy else break 

私はこれをどのように修正すればよい(私はまだ三項演算子を使用したい)

+6

'break'はステートメントなので、3進の内部では使用できません。ごめんなさい。 –

+0

私はあなたがそのケースに対して三項演算子を使うことはできないと思っています... – Ian

+0

リストから要素を削除するには、おそらく注意が必要です(逆の方法で行う方が安全です)。これをチェックしてください:http://stackoverflow.com/questions/35618307/how-to-transform-string-into-dict/35618686#35618686またPadraicの答えを参照してください – Ian

答えて

5

編集:?

(コメントでStefan Pochmannと私の会話を参照してください)

3進演算子はのためのものではなく、ステートメントではなく、代入式または式(およびbreak)はのみ文です:

a = 5 if cond else 3 #OK 
do() if cond else dont() #also OK 
do() if cond else break #not OK 

使用ステートメントを行うには、通常のif-else声明:

あなたはあなたのループロジックでブレークを使用することはできません
if cond: 
    do() 
else: 
    break 
+0

これは問題ありませんが、5〜6回入力すると醜いように見えますが、回避策がありますか? – TheChetan

+2

あなたの例は全く同じではありません。*有効な構文は – jonrsharpe

+2

です。@TheChetan:いいえ、ありません。 Pythonは、読みやすさに重点を置いています。 –

2

が再 itertools.takewhile 場合を使用して書き込むことができますあなたはより簡潔な解決策が必要です

digits = list(str(102)) 
dummy = list(str(102/2)) 

from itertools import takewhile 

for d in takewhile(dummy.__contains__, digits): 
    dummy.remove(d) 

あなたも、あなたのロジックを反転させることにより、forループを使用して、他の必要性を取り除くことがTrueのときjはダミー破壊していないかどうかを確認することができます:あなたはのいずれかの出現をすべて削除したい場合にも

for j in digits: 
    if j not in dummy: 
     break 
    dummy.remove(j) 

ダミーである桁からの最初の要素は、任意の繰り返し要素のためにそれを行うことはありません除去するが、意志を削除する要素のセットを作成した後、リストカンプを使用して:

digits = str(102) 
dummy = list(str(102/2)) 
st = set(takewhile(dummy.__contains__, digits)) 
dummy[:] = [d for d in dummy if d not in st] 

print(dummy) 

また、ノーので、文字列を反復処理することができます後にリスト操作を行う予定がない限り、数字のリストを呼び出す必要があります。

+2

ああ、ダンダーの方法を避けるのは難しいです。 'functools.partial'と' operator.contains'を使うことができます。 'in_dummy = partial(contains、dummy)'です。これはアンダースコアメソッドを避けるための多くの作業のようですが、本当のメリットはありません。ラムダは、代替として使用することができる。 'ダミーのラムダ:e ' –

+0

@JaredGoguen、そうですね、このような場合に '__contains__'を使用しても構いませんが、ラムダよりはるかに優れています。 –

関連する問題