Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在列表中查找字典键值的索引?(python)_Python_List_Dictionary - Fatal编程技术网

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

如何在列表中查找字典键值的索引?(python),python,list,dictionary,Python,List,Dictionary,假设我有一个列表,例如: listofpeople = [{'Jack': ['Blue', 'Red', 'Green']}, {'Barry': ['Red', 'Green', 'Orange']}] 如果我开始搜索“Jack”的索引,如果“Jack”是列表中字典的键值,我将如何找到他的索引 jack_indices = [i for i in range(len(listofpeople)) if listofpeople[i].keys() == ['Jack']] 或者,如果您的

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

listofpeople = [{'Jack': ['Blue', 'Red', 'Green']}, {'Barry': ['Red', 'Green', 'Orange']}]
如果我开始搜索“Jack”的索引,如果“Jack”是列表中字典的键值,我将如何找到他的索引

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
idx = next((i for i,d in enumerate(listofpeople) if "Jack" in d), None)
我正在将变量
l
解包为位置参数,然后将其传递给。这将导致一个带有值的平面列表
['Jack','Barry']
。内置函数
enumerate()
返回一个元组,其中包含一个计数(从0开始)和通过迭代iterable获得的值。我要做的下一件也是最后一件事是使用小型匿名函数过滤所有元组,其中第二个元素(
x[1]
)等于所需的
str

保持简单-

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

如果idx的末尾有一个值,那么您就有了将“jack”作为键的元素的索引

无论您做什么,请不要从
d.keys()返回的列表中查找字典键的存在情况。更有效的方法是直接查询字典。(免责声明:这显然只适用于Python2,因为Python3中返回的视图还支持有效的成员资格测试…)

然后,您可以只获取具有该键的第一个项的索引,例如:

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
idx = next((i for i,d in enumerate(listofpeople) if "Jack" in d), None)
供参考:


    • 这肯定不是最好的方法,但它与其他人的答案不同:

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

      列表中的字典可以有多个键吗?例如,{code>listofpeople=[{'Jack':['Blue','Red','Green'],'Rose':['Black','White']},{'Barry':['Red','Green','Orange']}]
是的,不同的名字将是多个键。我们需要在这里尝试阻塞吗?。只要
idx=next(如果d中的“Jack”为“无”,则enumerate(listofpeople)中的i为i,d为“无”)
就足够了?`令人惊讶的是,在我的机器上,这个答案比casualcoder慢's@YannicHamann这可能是因为列表很短,s.t.查找索引会立即返回。另外,函数调用/迭代器的开销少了。请考虑通过向代码添加解释来改进您的答案。只需注意:如果您只希望出现一次名称(或者只关心记录第一次出现)。通过在
idx=…
name = 'Jack'
idx = None
for ii, people in enumerate(listofpeople):
  try:
    people['Jack']
    idx = ii
    break
  except KeyError:
    continue