4

私は辞書を持っています:

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
4

4 に答える 4

4

このテストはどうですか:

(len(d[obj]) == 2) and isinstance(d[obj][0], int) and isinstance(d[obj][1], int)

isinstance(d[obj][1], (float, int))と の両方 intをチェックしfloatlong追加することもできます。

これは、何をテストする必要があるか、および OP 要求を満たす方法を示していますが、巧妙な構文を使用してさまざまな方法でテストを短縮できることは間違いありません。

更新: @Akavall によって指摘/提案されているように、これがリストであることをテストに含める必要がある場合は、and上記のテストの先頭に以下を追加できます。

isinstance(d[obj], list)
于 2012-05-18T03:35:33.967 に答える
1

それが素敵な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つの整数を持っているかどうかは尋ねません。リストであるかのようにインデックスを作成し、最初の要素を取得して整数として使用します。何かが失敗した場合、あなたのせいではなく、発信者のせいです。

せいぜい、タイプエラーを試行/キャッチして、より説明的なメッセージでそれらを再スローすることができますが、すべてのタイプを確認することはしません。

于 2012-05-18T03:43:58.170 に答える
0

試す:

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
于 2012-05-18T03:36:26.587 に答える
0

私の解決策は、@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
于 2012-05-18T04:44:32.563 に答える