【问题标题】:How to get values from a list of dictionaries, which themselves contain lists of dictionaries in Python如何从字典列表中获取值,这些字典本身包含 Python 中的字典列表
【发布时间】:2022-02-07 15:22:11
【问题描述】:

我遇到了从包含字典的列表中获取值的问题,其中每个字典都有一个带有字典的列表。可能听起来很容易,但我花了一些时间,我认为如果我发布它对其他人有用。我的数据示例如下:

player_info = [{[{'tag': 'tag 1'}]},
               {[{'tag': 'tag 2'}]}]

外部列表称为“player_info”。这包含 25 个字典,其中每个包含一个列表,其中包含(除其他外)一个名为“对手”的字典,其中包含一个包含字典的列表(是的,非常混乱)。从最里面的字典中,我想要与“标签”键关联的值。

我想到了两种方法:

  1. 创建一个循环。
for i in range(25):
    print(player_info[i]['opponent'][0]['tag'])
  1. 遍历列表:
{each_dictionary['opponent'][0]['tag'] for each_dictionary in player_info}

我认为第二种方式必须更有效。让我知道你的想法,以及是否有更聪明的方法来做到这一点。

【问题讨论】:

  • 包含一个小的代表性示例来说明您当前的数据结构以及您想要的结果是什么。
  • @jarmod 我做到了。我希望它对其他人有用!
  • 我没有看到 opponent 或您想要的结果的示例。
  • 这个阶段不用担心优化。您将来可能会更改数据结构,例如创建类。所以现在这两个选项都应该没问题。

标签: python list dictionary subset


【解决方案1】:

首先:dict 需要字典中每个元素的键值关联。您的第二级数据结构虽然不包括键:({[{'tag': 'tag 1'}]})这是一个set。与dict 不同,set 没有与其元素关联的键。所以你的数据结构看起来像List[Set[List[Dict[str, str]]]]

第二:当我尝试运行时

# python 3.8.8
player_info = [{[{'tag': 'tag 1'}]},
               {[{'tag': 'tag 2'}]}]

我收到错误 TypeError: unhashable type: 'list'。那是因为您的代码尝试在集合中包含一个列表。在 python 中设置成员资格要求成员是可散列的。但是,您将找不到在 list 对象上定义的 __hash__() 函数。即使您通过将list 替换为tuple 来解决此问题,您也会发现dict 对象也不是可散列的。潜在的解决方案包括使用不可变对象,例如 frozendicttuple,但这是另一篇文章。

为了回答你的问题,我将你的问题重新表述为

player_info = [[[{'tag': 'tag 1'}]],
               [[{'tag': 'tag 2'}]]]

并将性能差异与 A) 显式循环进行比较:

for i in range(len(player_info)):
  print(player_info[i][0][0]['tag'])

反对 B) 列表理解

[
  print(single_player_info[0][0]['tag']) 
  for single_player_info in player_info
]

使用%%timeit 单元魔法在jupyter 中运行上述代码块,我得到: A)154 µs ± 14.6 µs per loop (mean ± std. dev. of 7 runs, 10,000 loops each) 和 B)120 µs ± 11 µs per loop (mean ± std. dev. of 7 runs, 10,000 loops each)

注意:该实验存在严重偏差,至少有两个原因:

  1. 我只使用您提供的数据(N=2)测试了这两个试验。我们很可能会观察到与初始条件所暗示的不同的缩放行为。
  2. print 消耗大量时间,使这个问题严重受内核状态的影响

我希望这能回答你的问题。

【讨论】:

  • 感谢您的努力!在尝试提供最简单的示例时,也许我犯了一个错误。我会审核的。
猜你喜欢
  • 2020-03-26
  • 1970-01-01
  • 2013-08-22
  • 1970-01-01
  • 2017-10-23
  • 1970-01-01
  • 1970-01-01
  • 2018-09-13
  • 1970-01-01
相关资源
最近更新 更多