Python 如何通过标记值迭代给定的JSON文件数据

Python 如何通过标记值迭代给定的JSON文件数据,python,json,Python,Json,我想知道如何通过在内部字典中传递标记键的值来迭代json文件。 例如,若我超过90秒,它应该返回电影的名称和列表中包含90秒的标记值。 请在下面找到json示例 { "items": [ {"name": "The Shawshank Redemption", "tags": ["90s", "drama"]}, {"name": "The Godfather", "tags": ["70s", "drama", "crime"]}, {"name": "The Dark Knight",

我想知道如何通过在内部字典中传递标记键的值来迭代json文件。 例如,若我超过90秒,它应该返回电影的名称和列表中包含90秒的标记值。 请在下面找到json示例

{ "items": [
 {"name": "The Shawshank Redemption", "tags": ["90s", "drama"]},
 {"name": "The Godfather", "tags": ["70s", "drama", "crime"]},
 {"name": "The Dark Knight", "tags": ["action", "crime", "drama"]},
 {"name": "The Godfather: Part II", "tags": ["70s", "crime", "drama"]},
 ...]
}


我希望如果我搜索90年代、戏剧、犯罪或电影名称,它应该返回相应的字典,其中包含标签列表或电影名称中的任何这些值

import json

jsondata = """ { "items": [ {"name": "The Shawshank Redemption", "tags": ["90s", "drama"]},
 {"name": "The Godfather", "tags": ["70s", "drama", "crime"]},
 {"name": "The Dark Knight", "tags": ["action", "crime", "drama"]},
 {"name": "The Godfather: Part II", "tags": ["70s", "crime", "drama"]}
]}"""

data = json.loads(jsondata)


def findMoviesByTag(tag):
    r = []
    for item in data['items']:
        if tag in item['tags']:
            r.append(item)
    return r

result = findMoviesByTag("90s")
if len(result) == 0:
    print("no matches")
else:
    print(result)
结果:

[{'name': 'The Shawshank Redemption', 'tags': ['90s', 'drama']}]
[{'name': 'The Godfather', 'tags': ['70s', 'drama', 'crime']}, {'name': 'The Godfather: Part II', 'tags': ['70s', 'crime', 'drama']}]
或:

print(findMoviesByTag("70s"))
结果:

[{'name': 'The Shawshank Redemption', 'tags': ['90s', 'drama']}]
[{'name': 'The Godfather', 'tags': ['70s', 'drama', 'crime']}, {'name': 'The Godfather: Part II', 'tags': ['70s', 'crime', 'drama']}]

您可以使用列表理解来查找具有特定标记的所有电影

data = { "items": [
 {"name": "The Shawshank Redemption", "tags": ["90s", "drama"]},
 {"name": "The Godfather", "tags": ["70s", "drama", "crime"]},
 {"name": "The Dark Knight", "tags": ["action", "crime", "drama"]},
 {"name": "The Godfather: Part II", "tags": ["70s", "crime", "drama"]},
]}

def find_movies_by_tag(tag):

    #Get all dictionaries, for which the tag matches a tag in value list for tags
    return [item for item in data['items'] if tag in item.get('tags')]

print(find_movies_by_tag('drama'))
print(find_movies_by_tag('crime'))
print(find_movies_by_tag('70s'))
然后,输出将是:

print(find_movies_by_tag('drama'))
#[{'name': 'The Shawshank Redemption', 'tags': ['90s', 'drama']}, {'name': 'The Godfather', 'tags': ['70s', 'drama', 'crime']}, {'name': 'The Dark Knight', 'tags': ['action', 'crime', 'drama']}, {'name': 'The Godfather: Part II', 'tags': ['70s', 'crime', 'drama']}]

print(find_movies_by_tag('crime'))
#[{'name': 'The Godfather', 'tags': ['70s', 'drama', 'crime']}, {'name': 'The Dark Knight', 'tags': ['action', 'crime', 'drama']}, {'name': 'The Godfather: Part II', 'tags': ['70s', 'crime', 'drama']}]

print(find_movies_by_tag('70s'))
#[{'name': 'The Godfather', 'tags': ['70s', 'drama', 'crime']}, {'name': 'The Godfather: Part II', 'tags': ['70s', 'crime', 'drama']}]

我们不是来为你写代码的。发布您已经尝试过但不起作用的代码,我们将尝试告诉您How and whysHi@Steve感谢您的回复,我尝试了您的解决方案,并且在r.append(item)下面的break语句中工作正常,但是当我删除break语句时,我得到了错误:TypeError:“省略号”对象不可订阅。知道我为什么会犯这个错误吗?不,我想不出会是什么。我可能需要看看你的代码才能知道。你看到我的新代码了吗?你得到一个列表,然后如果你只想要一个匹配项,你可以选择第一项。您可以通过测试
len(result)==0
来检查是否存在匹配项。请注意,您的数据可以是JSON或Python代码。在这种特殊情况下,它们是一样的。如果你真的想从一个文件中读取数据,你会希望数据是JSON格式的,这就是我在这里根据你问题的标题所显示的。嗨@Steve感谢你的回答和帮助,它工作得很好,实际上我没有这样做data=JSON.loads(jsondata),我是直接在jsondata上做操作的,也许这就是为什么它向我显示这个错误的原因,谢谢你的帮助。哦……现在我知道那个错误是从哪里来的了。您在数据中留下了“…”。那把你的数据搞砸了。很高兴我能提供帮助。Hi@Devesh感谢您的回复,我尝试了您的解决方案,但显示错误:AttributeError:“str”对象没有属性“get”Fixed@vineetsingh请重新运行,现在应该可以正常工作:)Hi@Devesh我收到此错误:AttributeError:“省略号”对象在运行哪行后没有属性“get”?在函数
find\u movies\u by_tag
中,此函数:如果在item.get('tags')中标记,则返回[jsondata中item for item['items']