Python3で辞書のキーのタイプを取得する「クリーン」な方法はありますか?
たとえば、この辞書の1つにstr
タイプのキーがあるかどうかを判断したいと思います。
_d1 = { 1:'one', 2:'two', 5:'five' }
d2 = { '1':'one', '2':'two', '5':'five' }
_
これを実現する方法はいくつかあります。たとえば、次のように使用します。
_isinstance(list(d2.keys())[0], type('str'))
_
しかし、d2.keys()
はインデックス化できないため、これは非常に煩わしいので、キーの値を抽出するためだけにリストに変換する必要があります。
それでpython3はget_key_type(d2)
のようなものですか?そうでない場合、辞書のキーのタイプがstr
であるかどうかを確認するためのより適切な(よりクリーンな)方法はありますか?
私があなたの質問を正しく理解している場合、dictのすべてのキーのタイプを取得するために知っている最もクリーンな方法は次のとおりです。
_types1 = [type(k) for k in d1.keys()]
types2 = [type(k) for k in d2.keys()]
_
または、使用できるすべての一意のタイプが必要な場合:
_types1 = set(type(k) for k in d1.keys())
types2 = set(type(k) for k in d2.keys())
_
そのように、単一または複数のタイプがあるかどうかがわかります。 (@Duncanに感謝)
これは、それぞれの辞書で見つかったキーのタイプのリストを返します。
o/p:
_[<class 'int'>, <class 'int'>, <class 'int'>]
[<class 'str'>, <class 'str'>, <class 'str'>]
_
ただし、d2.keys()
のタイプについて質問する場合は、次のようになります。
_<class 'dict_keys'>
_
これが何とか役に立ったといいのですが。
辞書に文字列キーしかないかどうかを知りたい場合は、次のように使用できます。
_>>> set(map(type, d1)) == {str}
False
>>> set(map(type, d2)) == {str}
True
_
set(map(type, ...))
は、さまざまなタイプの辞書キーを含むセットを作成します。
_>>> set(map(type, d2))
{str}
>>> set(map(type, d1))
{int}
_
また、_{str}
_は、str
型を含むセットを作成するリテラルです。等価チェックはセットに対して機能し、セットにまったく同じアイテムが含まれている場合はTrue
を、そうでない場合はFalse
を返します。
d1.keys()
は、反復可能な<class 'dict_keys'>
タイプのオブジェクトを返しますが、リストのようにインデックスを付けることはできません
>>> d1 = { 1:'one', 2:'two', 5:'five' }
>>> d1.keys
<built-in method keys of dict object at 0x7f59bc897288>
>>> d1.keys()
dict_keys([1, 2, 5])
>>> type(d1.keys())
<class 'dict_keys'>
>>> [i for i in d1.keys()]
[1, 2, 5]
>>> [i for i in d1.keys() if isinstance(i, int)]
[1, 2, 5]
また、あなたが言ったことを繰り返すだけ
>>> d1.keys()[0]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'dict_keys' object does not support indexing
またチェック this out