Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/314.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_Json - Fatal编程技术网

如果另一个文件的Python列表中的字符串

如果另一个文件的Python列表中的字符串,python,json,Python,Json,我有一个包含多个结果的JSON文件: [{ "objectID": 1, "results": [ { "model": "Audi Audi TT Roadster", "price_int": 2200, "rzc_result_url": "https://url1.jpg" }, { "model": "Audi TT Roadster 1.8 T", "price_int": 299

我有一个包含多个结果的JSON文件:

[{
"objectID": 1,
"results": [
    {
        "model": "Audi Audi TT Roadster",
        "price_int": 2200,
        "rzc_result_url": "https://url1.jpg"
    },
    {
        "model": "Audi TT Roadster 1.8 T",
        "price_int": 2999,
        "rzc_result_url": "https://url1.jpg"
    },
    {
        "model": "Audi TT Roadster 1.8 T",
        "price_int": 2999,
        "rzc_result_url": "https://url1.jpg"
    }]
},
...
显然有多个objectID。我有另一个带字符串的文件。对于每个objectID,如果字符串在列表中,我希望脚本能够删除结果 排除模型文件:

{
    "1": ["1.8"],
    ...
}
预期产出:

[{
    "objectID": 1,
    "results": [
        {
            "model": "Audi Audi TT Roadster",
            "price_int": 2200,
            "rzc_result_url": "https://url1.jpg"
        }]
我的代码:

def excludeModels():
    with open('../json/exclude_models.json', encoding='utf-8') as data_file:
        r = json.loads(data_file.read())
        for item in data:
            results = item["results"]
            for k in results:
                objectID = item["objectID"]
                print(objectID)
                for d in r.get(objectID, []):
                    if d in results[k]['model']:
                        del results[k]
                        break

excludeModels()

JSON中没有
objectID
键,它是
id

无需每次通过
k
循环设置
objectID

您可以使用
any()
函数在一次调用中测试所有排除

def excludeModels():
    with open('../json/exclude_models.json', encoding='utf-8') as data_file:
        r = json.load(data_file)
    for item in data:
        results = item["results"]
        objectID = item["id"]
        print(objectID)
        if objectID in r:
            exclusions = r[objectID]
            for k, val in results.items():
                if any(d in val['model'] for d in exclusions)
                    del results[k]

我假设
data
r
如下:

data = [
    {
        "id": 1,
        "results": [
            {
                "model": "Audi Audi TT Roadster",
                "price_int": 2200,
                "rzc_result_url": "https://url1.jpg"
            },
            {
                "model": "Audi TT Roadster 1.8 T",
                "price_int": 2999,
                "rzc_result_url": "https://url1.jpg"
            },
            {
                "model": "Audi TT Roadster 1.8 T",
                "price_int": 2999,
                "rzc_result_url": "https://url1.jpg"
            }
        ]
    }
]
r = {"1": ["1.8"]}
>>> excludeModels(data, r)
>>> print(data)
[{'id': 1, 'results': [{'model': 'Audi Audi TT Roadster', 'price_int': 2200, 'rzc_result_url': 'https://url1.jpg'}]}]
然后您可以使用以下函数过滤数据字典。注意,
id
data
字典中是整数,但在
r
字典中是字符串!这是上面代码中的一个问题

另外,在删除列表中的值时要小心!当您迭代从中删除值的列表时,可能会出现一个问题,您无法迭代整个列表,因为您删除了手中的值。这就是为什么我首先将要删除的索引收集到
索引中。然后,我以相反的顺序迭代这个列表,以确保删除我真正想要删除的值

def excludeModels(data, r):
    for item in data:
        results, objectID = item["results"], item["id"]
        unwanted_strings = r.get(str(objectID), [])
        indices_to_del = []

        for i, item_res in enumerate(results):
            if any([(u_s in item_res['model']) for u_s in unwanted_strings]):
                indices_to_del.append(i)

        for res_i in indices_to_del[::-1]:
            results.pop(res_i)
结果如下:

data = [
    {
        "id": 1,
        "results": [
            {
                "model": "Audi Audi TT Roadster",
                "price_int": 2200,
                "rzc_result_url": "https://url1.jpg"
            },
            {
                "model": "Audi TT Roadster 1.8 T",
                "price_int": 2999,
                "rzc_result_url": "https://url1.jpg"
            },
            {
                "model": "Audi TT Roadster 1.8 T",
                "price_int": 2999,
                "rzc_result_url": "https://url1.jpg"
            }
        ]
    }
]
r = {"1": ["1.8"]}
>>> excludeModels(data, r)
>>> print(data)
[{'id': 1, 'results': [{'model': 'Audi Audi TT Roadster', 'price_int': 2200, 'rzc_result_url': 'https://url1.jpg'}]}]

您想从json文件还是内存字典中删除项?我想是从内存字典中删除。事实上,在我的代码中,字典是从一个json文件创建的,但在本例中我没有对其进行精确说明。
objectID=item[“objectID”]
您的意思是
objectID=item[“id”]
?。另外,你在哪里加载另一个文件?你能解释一下排除标准的细节吗?我看不到输入和输出之间有明显的关系。很抱歉出现了错误,我对其进行了编辑。在本例中,两个结果中都有“1.8”字符串,因此我想删除每一个结果。您可能需要解释为什么末尾的循环是反向的。@Barmar,感谢您注意我。我编辑了我的答案。