2016-08-28 3 views
0

ある場合にtrueを返しますが、このスニペットを考えてみてください:項目が空の文字列

>>> i = ["", 1, 2] 
>>> all([x for x in i]) 
False 

反復可能な内の項目が空の文字列の場合でも、このスニペットリターンTrueを作るためのPython的な方法でしょうか?

標準的な制限が適用されます - 項目がNoneまたはFalseなどの場合、期待どおりにFalseを返す必要があります。真の使用any()に評価され、少なくとも1つの項目がある場合はTrueをしたい場合

+0

少なくとも1つのアイテムが虚偽でない限り、スニペットに「True」を返すことを意味しますか?空の文字列を真実としてカウントしますか?私。空の文字列を除き、 'True'と' False'と数えられるものに関するPythonの規則に従ってください。 –

+0

はい、それは正しいです – vlad

答えて

1
all([x for x in i if not isinstance(x, str)]) 

唯一の偽の文字列は空の文字列なので、テストしたくない場合は、文字列を除外します。

+0

nitpick: '[]'は冗長です。 – bereal

+0

all(xはフィルタのx(xはx)) - 空の文字列を気にする必要がある場合は、少しだけクリーナー – reticentroot

+0

@reticentrootいいえ、[デフォルトのフィルタ(なし)](https://docs.python.org/ 3/library/functions.html#filter)は、すべてのFalsyを削除します。このFalsyは 'False'と' None'も取り除きます。 –

2
>>> lst = ["", 1, 2] 
>>> 
>>> all(True if i=='' else i for i in lst) 
True 

>>> any(lst) 
True 

一般any()all()で反復可能な引数を受け入れ、あなたがそれらをループする必要はありません。

+0

あなたと@ 2ビット錬金術士の回答が正しいので、彼はあなたに比べて得点がはるかに少ないので、私は彼の答えを受け入れます。あなたが気にしないことを願っています。お返事ありがとう – vlad

+0

@vladまず、答えは二番目に正しい答えを受け入れることを常に考慮する必要があります、私はこの想像上の点は私たちのために何かをしなければならないとは思わない:-D – Kasramvd

+0

あなたの返信ありがとう。あなたのスニペットが@ 2ビット錬金術師の別の結果を与える単一のシナリオを指摘できますか?あなたのスニペットはどう違うのですか?副次的なものとして、私のポイントは想像上のものではなく、一般的な人間倫理から生まれたもので、残念ながら多くの人が不足しています。 – vlad

-1

あなたは、例えば、allを使用することができます。

tests = [ 
    [None, False, "", 1, 2], 
    ["", 1, 2], 
    [1, 2], 
    [] 
] 

for i in tests: 
    print i 
    print all(filter(lambda x: x != '', i)) 
    print all(True if x == '' else x for x in i) 
    print '-' * 80 
+0

あなたの最初の解決策は、それらをフィルタリングするので、 'None'や' False'のような他の偽の値を捕まえる必要はありません。あなたの第3の解決策は、真実の価値を1つ見つけた後に退くため、失敗します。 –

+0

@ 2ビット錬金術師LOL、そうですね! : ') – BPL

2

このオプションは、私には良さそうです。

all(x or x=="" for x in i) 
関連する問題