如何在列表中查找字典键值的索引?(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