搜索字典数组并提取值

时间:2011-12-19 16:11:11

标签: python arrays multidimensional-array

我收到了以下数据:

[{'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中执行此操作的最有效方法是什么?谢谢!

3 个答案:

答案 0 :(得分:9)

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

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

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

如果name中没有data,则必须定义要执行的操作。

答案 1 :(得分:1)

定义一个函数,根据其名称查找玩家:

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'

答案 2 :(得分:1)

如果您只搜索一次或几次列表,其他人发布的解决方案效果很好。如果您经常搜索它,或者列表是多个项目,并且名称保证是唯一的,那么从该列表中创建一次字典可能会有所回报,然后通过名称访问该项目字典。或者,如果您的程序正在制作列表,请将它们放在字典中以开始。 (如果订单很重要,即您希望按照用户输入的顺序显示项目,请使用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}