web-dev-qa-db-ja.com

辞書のキーのタイプを取得します

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であるかどうかを確認するためのより適切な(よりクリーンな)方法はありますか?

8
Rockcat

私があなたの質問を正しく理解している場合、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'>
_

これが何とか役に立ったといいのですが。

8
Rayhane Mama

辞書に文字列キーしかないかどうかを知りたい場合は、次のように使用できます。

_>>> 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を返します。

2
MSeifert

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

1
Arpit Solanki