【问题标题】:search array of dictionaries and extract value搜索字典数组并提取值
【发布时间】:2011-12-19 16:11:10
【问题描述】:

我得到了以下数据:

[{'name': 'SqueezePlay', 'power': '1', 'playerid': '91:e2:b5:24:49:63', 'ip': '192.168.1.144:51346', 'canpoweroff': 1, 'displaytype': 'none', 'seq_no': '10', 'connected': 1, 'isplayer': 1, 'model': 'squeezeplay', 'uuid': 'fgh79fg7h98789798978'}, {'name': "FLX's iPhone", 'power': '1', 'playerid': '4c:32:d1:45:6c:4e', 'ip': '84.105.161.205:53972', 'canpoweroff': 1, 'displaytype': 'none', 'seq_no': 0, 'connected': 1, 'isplayer': 1, 'model': 'iPengiPod', 'uuid': '9791c009e3e7fghfg346456456'}]

我更改了隐私方式的值。 我想根据“name”(例如“SqueezePlay”)搜索数组,并检索“playerid”(例如“91:e2:b5:24:49:63”)。

在 Python 中最有效的方法是什么?谢谢!

【问题讨论】:

  • 它不是一个数组。你能把这个问题改成“字典”吗,因为它确实是这样的。
  • 从技术上讲,它是一个字典数组。
  • 字典列表,如果我们想挑剔的话。但这不是问题的目标。
  • names 是否保证是唯一的?

标签: python arrays multidimensional-array


【解决方案1】:

如果你的字典列表是data,那么你可以试试这个:

next(d for d in data if d['name'] == 'SqueezePlay')['playerid']

这将返回'91:e2:b5:24:49:63'(对于给定名称的第一次出现)。

如果给定的name 不在您的data 中,您必须定义该怎么做。

【讨论】:

    【解决方案2】:

    定义一个函数来根据名字查找玩家:

    def find_player(all_players, name):
        for player in all_players:
            if player['name'] == name:
                return player['playerid']
    

    这样(我猜name 是独一无二的)您不必循环播放整个玩家列表,而是在找到它后返回它的playerid

    >>> p = [{'name': 'SqueezePlay', 'power': '1', 'playerid': '91:e2:b5:24:49:63', 'ip': '192.168.1.144:51346', 'canpoweroff': 1, 'displaytype': 'none', 'seq_no': '10', 'connected': 1, 'isplayer': 1, 'model': 'squeezeplay', 'uuid': 'fgh79fg7h98789798978'}, {'name': "FLX's iPhone", 'power': '1', 'playerid': '4c:32:d1:45:6c:4e', 'ip': '84.105.161.205:53972', 'canpoweroff': 1, 'displaytype': 'none', 'seq_no': 0, 'connected': 1, 'isplayer': 1, 'model': 'iPengiPod', 'uuid': '9791c009e3e7fghfg346456456'}]
    >>> find_player(p, 'SqueezePlay')
    '91:e2:b5:24:49:63'
    

    【讨论】:

      【解决方案3】:

      如果您只搜索列表一次或几次,其他人发布的解决方案效果很好。如果您将经常搜索它,或者如果列表中包含多个项目,并且名称保证是唯一的,那么从该列表中创建字典一次,然后按名称访问其中的项目可能会有所回报字典。或者,如果您的程序正在制作列表,请将它们放入字典中。 (如果顺序很重要,即您想按照用户输入的顺序显示项目,请使用collections.OrderedDict。)

      lyst = [{'name': 'SqueezePlay', 'power': '1', 'playerid': '91:e2:b5:24:49:63', 
               'ip': '192.168.1.144:51346', 'canpoweroff': 1, 'displaytype': 'none',
               'seq_no': '10', 'connected': 1, 'isplayer': 1, 'model': 'squeezeplay',
               'uuid': 'fgh79fg7h98789798978'}, {'name': "FLX's iPhone", 'power': '1',
               'playerid': '4c:32:d1:45:6c:4e', 'ip': '84.105.161.205:53972',
               'canpoweroff': 1, 'displaytype': 'none', 'seq_no': 0, 'connected': 1,
               'isplayer': 1, 'model': 'iPengiPod', 'uuid': '9791c009e3e7fghfg346456456'}]
      
      dyct = dict((item.pop("name"), item) for item in lyst)
      # Python 3: {item.pop("name"): item for item in lyst}
      
      print dyct["SqueezePlay"]
      

      请注意,生成的字典不再将name 作为嵌套字典的键;它已被弹出以避免在两个地方重复数据(如果你将它保存在两个地方,更新它的工作量是两倍,如果你忘记了某个地方,它们就会不同步)。如果您想保留它,请改为:

      dyct = dict((item["name"], item) for item in lyst)
      # Python 3: {item["name"]: item for item in lyst}
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2022-06-19
        • 1970-01-01
        • 2015-03-28
        • 1970-01-01
        • 1970-01-01
        • 2017-02-03
        • 1970-01-01
        相关资源
        最近更新 更多