Python中如何判断列表所有元素都存在于字典列表中并获取对应ID
实现方案
原代码错误原因
- 变量名误用Python内置关键字
dict,覆盖内置类型会导致后续调用字典相关功能时报错,建议替换为data这类语义化的普通变量名 - 条件判断逻辑写反:原代码尝试判断整个
name_list列表是否存在于单个用户的name字符串中,逻辑完全不成立,永远返回False
正确实现代码
利用集合的子集判断特性可以简洁高效完成需求:
# 原数据修改变量名,避免覆盖内置关键字 data = [ { "id" : 1, "people" : [ { "name" : "Sarah", "surename" : "something" }, { "name" : "Luke", "surename" : "something" }, { "name" : "Chris", "surename" : "something" } ] }, { "id" : 2, "people" : [ { "name" : "Jhon", "surename" : "something" }, { "name" : "Luke", "surename" : "something" }, { "name" : "Ronald", "surename" : "something" } ] } ] name_list = ["Sarah", "Luke"] result_ids = [] for item in data: # 提取当前条目下所有人员姓名转为集合 exist_names = {p["name"] for p in item["people"]} # 判断目标姓名列表是否全部存在 if set(name_list).issubset(exist_names): result_ids.append(item["id"]) # 此处可添加你需要的后续操作 print(result_ids) # 输出结果为 [1],符合要求
如果需要更简洁的写法,也可以用列表推导式直接获取结果:
result_ids = [item["id"] for item in data if set(name_list).issubset({p["name"] for p in item["people"]})]
补充说明
如果你的name_list存在重复姓名,且要求重复姓名的匹配次数和列表中一致,可以用collections.Counter替换集合做判断,普通无重复的场景下用集合判断效率最高。
内容的提问来源于stack exchange,提问作者Mr.Noob4Life
相关产品推荐
相关产品推荐

