私は辞書を持っています:
self.currently_occupied = {obj:[0, 0]}
obj の値に、リスト内の 2 つの数値以外のものが含まれているかどうかを確認する必要があります
例:
obj:[58, -234] is ok
obj:[32] is not
obj:[] is not
obj:[4, k] is not
私は辞書を持っています:
self.currently_occupied = {obj:[0, 0]}
obj の値に、リスト内の 2 つの数値以外のものが含まれているかどうかを確認する必要があります
例:
obj:[58, -234] is ok
obj:[32] is not
obj:[] is not
obj:[4, k] is not
このテストはどうですか:
(len(d[obj]) == 2) and isinstance(d[obj][0], int) and isinstance(d[obj][1], int)
isinstance(d[obj][1], (float, int))
と の両方 int
をチェックしfloat
、long
追加することもできます。
これは、何をテストする必要があるか、および OP 要求を満たす方法を示していますが、巧妙な構文を使用してさまざまな方法でテストを短縮できることは間違いありません。
更新: @Akavall によって指摘/提案されているように、これがリストであることをテストに含める必要がある場合は、and
上記のテストの先頭に以下を追加できます。
isinstance(d[obj], list)
それが素敵なPythonでどのように達成できるかを簡単に見てみましょう:
def foo(currently_occupied):
return all(isinstance(item, list)
and len(item) == 2
and all (isinstance(subitem, int)
for subitem in item)
for item in currently_occupied.itervalues())
さて、Pythonでこの種のチェックを実装することは想定されていないことをお伝えしましょう。ここでの哲学はアヒルのタイピングです。それがアヒルのように歩き、アヒルのように聞こえるなら、それはアヒルです。
オブジェクトがリストであり、2つの整数を持っているかどうかは尋ねません。リストであるかのようにインデックスを作成し、最初の要素を取得して整数として使用します。何かが失敗した場合、あなたのせいではなく、発信者のせいです。
せいぜい、タイプエラーを試行/キャッチして、より説明的なメッセージでそれらを再スローすることができますが、すべてのタイプを確認することはしません。
試す:
def two_int_list(value):
return isinstance(value, list) and len(value) == 2 and \
all(map(lambda x: isinstance(x, int), value))
def validate_dict_key(dictionary, key, valid=two_int_list):
return key in dictionary and valid(dictionary[key])
validate_dict_key({'obj': [58, -234]}, 'obj') # True
validate_dict_key({'obj': [32]}, 'obj') # False
validate_dict_key({'obj': (58, -234)}, 'obj') # False; only accepts list objects, not sure if this is what you want
私の解決策は、@Levonの解決策に基づいていますが、もう1つ詳細を追加しています。is を使用するだけisinstance
で、数値で構成されていないリストを修飾することができます。例えば:
[float('nan'), float('inf')]
技術的には上記の値は両方ともfloat
;であるため、資格があります。ただし、数値ではありません。したがって、それを制御するための条件を追加する必要があります。
import numpy as np
def check(x):
if isinstance(x,list):
if len(x) == 2:
if all(isinstance(ele, (int, float)) and np.isinf(ele) == False and np.isnan(ele) == False for ele in x):
return True
return False
結果:
>>> check([2,3])
True
>>> check([4, float('inf')])
False
編集:
を使用するとコードがきれいになると思います。また、この場合isfinite
は使用する必要もないと思います。isinstance
結果のコードは次のようになります。
def check(x):
if isinstance(x,list):
if len(x) == 2:
if all(np.isfinite(ele) for ele in x):
return True
return False