2013-08-28 10 views
9

オブジェクトが文字列のリストであるかどうかをチェックする方法は?オブジェクトのような文字列である場合は私だけチェックすることができ:オブジェクトが文字列のリストであるかどうかをチェックする方法?

def checktype(obj): 
    if isinstance(obj,str): 
    print "It's a string" 

obj1 = ['foo','bar','bar','black','sheet'] 
obj2 = [1,2,3,4,5,'bar'] 
obj3 = 'bar' 

for i in [obj1,obj2,obj3]: 
    checktype(i) 

所望の出力:リスト内のすべての項目が文字列の場合

It's a list of strings 
It's not a list of strings or a single string 
It's a single string 
+2

明確にするために、私は 'is_list_of_string''へchecktype'の名前を変更します。 –

+3

考慮すべき点: '[]'は文字列のリストかどうか? – abarnert

+0

'[]'は文字列のリストではありませんが、空のリストです。 – alvas

答えて

15

このようなものはありますか?あなたはそれが単一の文字列かどうかを確認するためにいくつかのチェックを行うことができます。 basestring代わりのstrをチェックするのはなぜ

>>> def checktype(obj): 
     return bool(obj) and all(isinstance(elem, basestring) for elem in obj) 

>>> obj1 = ['foo','bar','bar','black','sheet'] 
>>> obj2 = [1,2,3,4,5,'bar'] 
>>> obj3 = 'bar' 
>>> for i in [obj1, obj2, obj3] : 
     print checktype(i) 


True 
False 
True 

?それはstrunicode両方のタイプから継承する一般的なクラスだから

あなたはbasestring代わりのstrをチェックする必要があります。 strのみをチェックすると、unicodeタイプは除外されます。

Steven Rumbalski'sのように、文字列のリストを確認する必要がある場合は、これを行うことができます。

>>> def is_list_of_strings(lst): 
     return bool(lst) and not isinstance(lst, basestring) and all(isinstance(elem, basestring) for elem in lst) 
     # You could break it down into `if-else` constructs to make it clearer to read. 

>>> for i in [obj1, obj2, obj3] : 
     print is_list_of_strings(i) 


True 
False 
False 

EDITからabarnert's提案を1として、あなたはまた、代わりにnot isinstance(lst, basestring)listをチェックすることができ、コードは次のように書き換えになるだろう。

>>> def is_list_of_strings(lst): 
     return bool(lst) and isinstance(lst, list) and all(isinstance(elem, basestring) for elem in lst) 
     # You could break it down into `if-else` constructs to make it clearer to read. 

>>> for i in [obj1, obj2, obj3] : 
     print is_list_of_strings(i) 


True 
False 
False 

1つのライナーから移動することができます。

>>> def is_list_of_strings(lst): 
     if lst and isinstance(lst, list): 
      return all(isinstance(elem, basestring) for elem in lst) 
     else: 
      return False 
+3

仕様では、文字列の*リスト*をテストするので、 'checktype( 'bar')'は 'False'を返します。 'basestring'を使ってうまくいった。 –

+0

@StevenRumbalski:これが修正されました。コメントありがとう。 :) –

+3

実際には、isinstance(lst、listst)よりもisinstance(lst、basestring)よりもチェックする方が良いと思います。結局のところ、文字列を文字列にマッピングするdictは、文字列以外の文字列のリストではありません...しかし、そうでなければ、素晴らしい答えです。 – abarnert

13

allビルトインを使用し、テストし、発電機:あなたのリストが空の場合には、技術的に0の文字列のリストであるため、そのかかわら

if all(isinstance(s, str) for s in lis): 

注、これはまだTrueを返します。あなたはFalseとして[]を検討したいので、あなたはこれを行う必要があります:

if lis and all(isinstance(s, str) for s in lis): 

だから、あなたの関数は次のようなものでなければなりません:この関数

def checktype(obj): 
    # This if statement makes sure input is a list that is not empty 
    if obj and isinstance(obj, list): 
     return all(isinstance(s, str) for s in obj) 
    else: 
     return False 

場合のみTrueを返します。その入力は空ではなく、完全に文字列で構成されたリストです。それ以外のもの([]['a', 1]('a', 'b')など)は、Falseを返します。

また、この方法でallを使用すると、見つかった最初のアイテムのチェックが停止し、False(文字列ではありません)を返すという点で追加のボーナスがあります。これにより非常に大きなリストを非常に効率的に扱うことができます。

+2

良い答えですが、インスタンスチェックを 'str'から' basestr'に変更しました。 –

+2

...もちろん、OPは実際には文字列の "リスト"ではなく "文字列"の "リスト"を意味していたのですが...可能ですが、それは彼が望んだことではありませんでした。 (@StevenRumbalskiはこれを彼の答えでかなりうまく説明しているので、ここで再び説明する必要はないと思う) – abarnert

+0

OPの投稿で、彼はそれが ' str'ではなく 'basestring'です。 – iCodez

2

私がこれまで読んだ答えは、文字列でない非リストが与えられたときにexepctionsを発生させます。また、iterableでもありません。

ダックタイピングアプローチを取る

In Python, how do I determine if an object is iterable?

:その質問がで対処され

def categorize(x): 
    result = "not a string or list of strings" 
    if isinstance(x, basestring): 
     return "It's a single string" 
    try: 
     if all(isinstance(y, basestring) for y in x): 
      return "It's a list of strings" 
    except TypeError: 
     pass 
    return "It's not a list of strings or a single string" 

data = [ 5, "xyzzy", list("xyzzy"), ['1', '23', 456]] 
for x in data: 
    print x, categorize(x) 

出力:

5 It's not a list of strings or a single string 
xyzzy It's a single string 
['x', 'y', 'z', 'z', 'y'] It's a list of strings 
['1', '23', 456] It's not a list of strings or a single string 
関連する問題