【问题标题】:Finding the type of dictionary values without knowing the keys在不知道键的情况下查找字典值的类型
【发布时间】:2017-05-17 12:53:18
【问题描述】:

假设我们有一个这样的字典:

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

如何在不知道任何键的情况下以最有效的方式获取值的类型(列表中的单个项目,而不是列表本身)?

我想出了两种方法,但都觉得有点矫枉过正:

方法一:

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

我想随着字典变大,将 my_dict.values() 转换为列表可能会变慢..


方法二:

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

一个完整的 for 循环,在单次迭代后手动终止..

那么,有没有更好的办法呢?

问题在于dict.values() 不返回一个iterator,而是一个不支持索引的dict_values 对象..

编辑:对于这个例子,假设所有字典键的变量类型都是相同的。

【问题讨论】:

  • dict_values 确实实现了迭代器协议。仅仅因为它不支持索引并不意味着它不可迭代。
  • @NicholasFlees 那么你会怎么做呢?
  • 我对你想要做什么感到有点困惑。您是否只是想获取字典中值的第一个元素的类型(假定为列表)?
  • @NicholasFlees 如果my_list 是任意字典键的值,我正在尝试获取[type(x) for x in my_list]。所以在这个例子中它将是[int, float, str, function, ..]

标签: python python-3.x dictionary


【解决方案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))]]

【讨论】:

  • iter 很好!但是您也可以直接在值上使用它。喜欢next(iter(my_dict.values()))
  • @Ev.Kounis 这对 Python 3 来说是正确的并且更好。对于 Python 2,您可能希望使用 .itervalues() 而不是 .values() 来避免创建列表副本。我使用的语法不需要对 Python 2 进行任何修改,但是既然您已经标记了 Python 3,请按照您的方式进行:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-26
  • 1970-01-01
  • 1970-01-01
  • 2016-01-13
  • 1970-01-01
  • 2012-09-19
相关资源
最近更新 更多