繁体   English   中英

如何在列表中查找字典键值的索引? (蟒蛇)

[英]How to find index of a dictionary key value within a list? (python)

假设我有一个列表,例如:

listofpeople = [{'Jack': ['Blue', 'Red', 'Green']}, {'Barry': ['Red', 'Green', 'Orange']}]

如果我要搜索 'Jack' 的索引,如果 'Jack' 是列表中字典的键值,我将如何找到他的索引?

保持简单——

for people in listofpeople:
    if 'Jack' in people:
        idx = listofpeople.index(people)

如果 idx 最后有一个值,则您将获得以“jack”为键的元素的索引

>>> listofpeople = [{'Jack': ['Blue', 'Red', 'Green']}, {'Barry': ['Red', 'Green', 'Orange']}]
>>> [i for i, d in enumerate(listofpeople) if "Jack" in d.keys()]
[0]
>>> l = [{'Jack': ['Blue', 'Red', 'Green']}, {'Barry': ['Red', 'Green', 'Orange']}]
>>> import itertools as it
>>> list(filter(lambda x: x[1] == 'Jack', enumerate(it.chain(*l))))
[(0, 'Jack')]

我将变量l解包为位置参数,然后将其传递给itertools.chain() 这会生成一个值为['Jack', 'Barry']的平面列表。 内置函数enumerate()返回一个包含计数(从 0 开始)和迭代迭代获得的值的元组。 我做的下一件也是最后一件事情是用小的匿名函数过滤第二个元素 ( x[1] ) 等于所需str所有元组。

无论你做什么,请不要从d.keys()返回的列表中查找字典键的存在。 直接查询字典效率更高。 (免责声明:显然这仅适用于 Python 2,因为 Python 3 中返回的视图还支持高效的成员资格测试......)

然后你可以只获取具有键的第一个项目的索引,例如,像这样:

idx = next((i for i,d in enumerate(listofpeople) if "Jack" in d), None)

供参考:

试试这个:

jack_indices = [i for i in range(len(listofpeople)) if listofpeople[i].keys() == ['Jack']]

或者,如果您的字典可以有多个键,并且您正在查找包含“Jack”作为键的所有索引,您可以执行以下操作:

jack_indices = [i for i in range(len(listofpeople)) if 'Jack' in listofpeople[i].keys()]

也许是这样的:

listofpeople = [{'Jack': ['Blue', 'Red', 'Green']}, {'Barry': ['Red', 'Green', 'Orange']}]
idx = 0
for i in listofpeople:
  for j in i.keys():
    if j == 'Jack':
      print(idx)
      break
  idx += 1
name = "Jack"
for index, value in enumerate(listofpeople):
    if name in value.keys():
        print('{} at index {}'.format(value, index))
>>>{'Jack': ['Blue', 'Red', 'Green']} at index 0

这绝对不是最好的方式,但是和大家的回答不一样:

name = 'Jack'
idx = None
for ii, people in enumerate(listofpeople):
  try:
    people['Jack']
    idx = ii
    break
  except KeyError:
    continue

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM