如何在 Python 中的嵌套字典列表中查找键的值
How to find the values of a key in a nested list of dictionaries in Python
这是我的数据结构。我在 'clothes list' 中有 3000 个 'product' 实例。每个都包含另一个存储评论的词典列表。
clothes_list =
[
{
"ID": "1000201",
"Name": "Clothes Name",
"Price": 24.1,
"Category": "Trousers"
"Reviews": [{'User': 'username1200', 'Review': 'some review', 'Score': 2}
{'User': 'username341', 'Review': 'Some review 2' , 'Score': 4}
{'User': 'username34841', 'Review': 'Some review 3' , 'Score': 2}
]
},
{
"ID": "1003801",
"Name": "Clothes Name",
"Price": 29.1,
"Category": "Trousers"
"Reviews": [{'User': 'username1200', 'Review': 'some review', 'Score': 2}
{'User': 'username341', 'Review': 'Some review 4' , 'Score': 7}
{'User': 'username34841', 'Review': 'Some review 5' , 'Score': 4}
]
},
]
我正在尝试遍历字典中的所有评论和 return 由特定用户名撰写的所有评论。
我下面的两次尝试输出相同的错误。
username = "username341"
reviews = next((review for review in clothess_list if review["Reviews"]["User"] == username))]
values = [a_dict["Reviews"][username] for a_dict in clothes_list]
错误
TypeError: list indices must be integers or slices, not str
目标输出
{'User': 'username341', 'Review': 'Some review 2' , 'Score': 4},
{'User': 'username341', 'Review': 'Some review 4' , 'Score': 7}
您的尝试不正确,因为您将列表视为字典。以下代码段可以解决您的问题,但这可能不是最好的方法。
reviews = next(
c for c in clothes_list
if any(review for review in c["Reviews"] if review["User"] == username)
)
您的逻辑 review["Reviews"]["User"]
不能迭代,因为 Reviews
是一个字典列表。不能直接调用dictionary而不放list的索引。
username = "username341"
reviews=next( user for review in clothes_list for user in review['Reviews'] if user['User']==username)
print(reviews)
输出
{'User': 'username341', 'Review': 'Some review 2', 'Score': 4}
我发现把它写成多行最简单,就好像我在写多个 for 循环一样
[review
for clothes_item in clothes_list
for review in clothes_item["Reviews"]
if review["User"] = username
]
如果需要,您当然可以通过将 []
替换为 ()
将其变成生成器
试试这个:
clothes_list = [{
"ID": "1000201",
"Name": "Clothes Name",
"Price": 24.1,
"Category": "Trousers",
"Reviews": [{
"User": "username1200", "Review": "some review", "Score": 2
}, {'User': 'username341', 'Review': 'Some review 2', 'Score': 4},
{'User': 'username34841', 'Review': 'Some review 3', 'Score': 2},{
"User": "username1200", "Review": "some review 4 by same user", "Score": 2
},]
}]
def get_reviews(username):
a = []
for i in range(len(clothes_list)):
for x in clothes_list[i]["Reviews"]:
if x["User"] == username:
a.append(x)
return a
print(get_reviews("username1200"))
其他人的答案也是正确的,只是数据集只包含每个用户的一条评论。我编辑了数据集以包含来自 username1200
的 2 条评论
使用我提供的数据集尝试其他答案,它会 return 列表中有 2 个字典。
这是我的数据结构。我在 'clothes list' 中有 3000 个 'product' 实例。每个都包含另一个存储评论的词典列表。
clothes_list =
[
{
"ID": "1000201",
"Name": "Clothes Name",
"Price": 24.1,
"Category": "Trousers"
"Reviews": [{'User': 'username1200', 'Review': 'some review', 'Score': 2}
{'User': 'username341', 'Review': 'Some review 2' , 'Score': 4}
{'User': 'username34841', 'Review': 'Some review 3' , 'Score': 2}
]
},
{
"ID": "1003801",
"Name": "Clothes Name",
"Price": 29.1,
"Category": "Trousers"
"Reviews": [{'User': 'username1200', 'Review': 'some review', 'Score': 2}
{'User': 'username341', 'Review': 'Some review 4' , 'Score': 7}
{'User': 'username34841', 'Review': 'Some review 5' , 'Score': 4}
]
},
]
我正在尝试遍历字典中的所有评论和 return 由特定用户名撰写的所有评论。
我下面的两次尝试输出相同的错误。
username = "username341"
reviews = next((review for review in clothess_list if review["Reviews"]["User"] == username))]
values = [a_dict["Reviews"][username] for a_dict in clothes_list]
错误
TypeError: list indices must be integers or slices, not str
目标输出
{'User': 'username341', 'Review': 'Some review 2' , 'Score': 4},
{'User': 'username341', 'Review': 'Some review 4' , 'Score': 7}
您的尝试不正确,因为您将列表视为字典。以下代码段可以解决您的问题,但这可能不是最好的方法。
reviews = next(
c for c in clothes_list
if any(review for review in c["Reviews"] if review["User"] == username)
)
您的逻辑 review["Reviews"]["User"]
不能迭代,因为 Reviews
是一个字典列表。不能直接调用dictionary而不放list的索引。
username = "username341"
reviews=next( user for review in clothes_list for user in review['Reviews'] if user['User']==username)
print(reviews)
输出
{'User': 'username341', 'Review': 'Some review 2', 'Score': 4}
我发现把它写成多行最简单,就好像我在写多个 for 循环一样
[review
for clothes_item in clothes_list
for review in clothes_item["Reviews"]
if review["User"] = username
]
如果需要,您当然可以通过将 []
替换为 ()
试试这个:
clothes_list = [{
"ID": "1000201",
"Name": "Clothes Name",
"Price": 24.1,
"Category": "Trousers",
"Reviews": [{
"User": "username1200", "Review": "some review", "Score": 2
}, {'User': 'username341', 'Review': 'Some review 2', 'Score': 4},
{'User': 'username34841', 'Review': 'Some review 3', 'Score': 2},{
"User": "username1200", "Review": "some review 4 by same user", "Score": 2
},]
}]
def get_reviews(username):
a = []
for i in range(len(clothes_list)):
for x in clothes_list[i]["Reviews"]:
if x["User"] == username:
a.append(x)
return a
print(get_reviews("username1200"))
其他人的答案也是正确的,只是数据集只包含每个用户的一条评论。我编辑了数据集以包含来自 username1200
的 2 条评论使用我提供的数据集尝试其他答案,它会 return 列表中有 2 个字典。