2017-05-17 47 views
1

假設我們有一個字典,像這樣:查找字典值的類型,而無需知道鍵

my_dict = {'foo': [1, 2.325, 'asdasd', lambda x: x[0], ...], ...} 

一個如何得到的值的類型(個人列表項,而不是名單本身)不知道最有效的方法中的任何鍵?

我想出了兩種方法,但他們都覺得像一個矯枉過正:

方法1:

var_types = [type(x) for x in list(my_dict.values())[0]] 

我想,作爲字典變大,鑄造my_dict.values()列出可能會變慢..


方法2:

for k in my_dict: 
    var_types = [type(x) for x in my_dict[k]] 
    break 

一個完整的循環for是一個迭代後手動終止..

那麼,有沒有更好的辦法?

的問題是,dict.values()不會返回迭代dict_values對象不支持索引..

編輯:在這個例子中是安全的假設變量類型所有字典鍵是一樣的。

+0

'dict_values'確實實現了迭代器協議。僅僅因爲它不支持索引,並不意味着它不可迭代。 –

+0

@NicholasFlees那麼你會怎麼做呢? –

+0

我對你想要做的事情有點困惑。你只是試圖獲取字典中值的第一個元素的類型(假定它是列表)? –

回答

1

你可以使用next(iter(my_dict))選擇一個arbitrary key,然後通過map()或理解推導類型:

list(map(type,my_dict[next(iter(my_dict))])) 

[type(item) for item in my_dict[next(iter(my_dict))]] 
+0

'iter'很好!但是你也可以直接在值上使用它。像'next(iter(my_dict.values()))' –

+0

@ Ev.Kounis對於Python 3來說,這是真的,更好。對於Python 2,您需要'.itervalues()'而不是'.values()'來避免創建一個列表副本。我使用的語法不需要對Python 2進行任何修改,但是由於您已經標記了Python 3,請按照自己的方式進行操作:) –