我收到了以下数据:
[{'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中执行此操作的最有效方法是什么?谢谢!
答案 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}