【问题标题】:Compare dictionaries from different files比较来自不同文件的字典
【发布时间】:2021-04-16 13:39:58
【问题描述】:

我的问题有点牵强,但我会尽量表达清楚。

我有两个包含不同字典的 python 文件。

在文件science.py中字典的结果如下:

    dict1 = { "microbiome": {
                  "lang": "en",
                  "lemmatizer": "microbiome",
                  "Wikidata": "http://www.wikidata.org/entity/Q1330402"
                  "DBpedia": "http://dbpedia.org/resource/Microbiota"
          }, "teaching innovation": {
                 "lang": "en",
                 "lemmatizer": "innovación docente",
                 "Wikidata": null,
                 "DBpedia": null
              },
               ...... 
          }

这个字典结构的内容是建立在一个我称之为process (word)的函数中。

compact.py文件的输出如下:

    dict2 = { http://dbpedia.org/resource/Microbiota :[
                 {'keyword': 'Microbiota', 'language': 'ca'}, 
                 {'keyword': 'Microbiota', 'language': 'en'}, 
                 {'keyword': 'Microbioma', 'language': 'es'}],
             'teaching innovation': [{'keyword': 'Semantics', 
                                     'language': 'en'},
                        {'keyword': 'Semàntica', 'language': 'ca'},
                        {'keyword': 'Semántica lingüística', 
                        'language': 'es'}],
            .... }

该词典结构的内容是通过一个名为query_kw (uri) 的函数构建的,其中对DBpedia 页面进行查询以从uri 中获取单词的翻译。这会以字典的形式返回一个包含单词不同翻译的列表。

正如在dict2 中看到的那样,它包含一个单词的翻译以及它们所使用的语言。我要做的是检查来自dict1 的单词是否在 dict2 中找到。 在我上面放的小例子中,你可以看到。如果我们查看dict1 的字典键是“微生物组”,那么我必须检查它是否在 dict2 的字典列表中。如果没有找到,则以与其他相同的方式将其添加到dict2 列表中({'keyword': microbiome, 'language': 'en'})。

那么结果必须如下:

           dict2 = { http://dbpedia.org/resource/Microbiota :[
                        {'keyword': 'Microbiota', 'language': 'ca'}, 
                        {'keyword': 'Microbiota', 'language': 'en'}, 
                        {'keyword': 'Microbioma', 'language': 'es'},
                        {'keyword': 'microbiome', 'language': 'en'}],
                    'teaching innovation': [{'keyword': 'Semantics', 
                                          'language': 'en'},
                        {'keyword': 'Semàntica', 'language': 'ca'},
                        {'keyword': 'Semántica lingüística', 
                                     'language': 'es'}],
                        {'keyword': 'teaching innovation', 
                                     'language': 'en'}],
                 .... }

我尝试过的方法如下(我知道这不是最佳的,但我想知道我该怎么做):

wrapper = query_kw(uri)
res_keys = process(palabra)
for k in rest_keys.keys():
    wrap = {'keyword': rest_keys[k], 'language': rest_keys[k]['language']
    for ind in wrapper:
        for key, value in wrapper[ind]:
            for ky, v in wrap:  
                if key is not ky and value is not v:
                    wrapper.append(wrap)

我已经说过,它不美观,也不是最佳的,最重要的是它不能正常工作,但我想不出该怎么做。我希望我已经很好地解释了自己。

【问题讨论】:

    标签: python python-3.x list dictionary


    【解决方案1】:

    好吧,我已经发布了这个简短的脚本,您可以运行完整的代码来验证它是否适用于您问题中的示例。

    基本上我使用字典理解,并使用DBpedia 作为关联两个字典的键。

    如果您有任何问题(如果这是您想要的),请告诉我。

    def merge_dicts(dict1, dict2):
        # Assuming every item on dict1 has a `DBpedia` key and a `lang` key
        new_items = {items['DBpedia']: [{'keyword': key, 'language': items['lang']}] for key, items in dict1.items()}
        for url, new_item_list in new_items.items():
            # Assuming every item on dict2 has the `DBpedia` url as keys
            for item in dict2[url]:
                found = False
                for new_item in new_item_list:
                    if item['keyword'].strip().lower() == new_item['keyword'].strip().lower():
                        found = True
                        break
                if found:
                    break
            if not found:
                dict2[url].append(new_item)
    
        return dict2
    
    dict1 = { "microbiome": {
              "lang": "en",
              "lemmatizer": "microbiome",
              "Wikidata": "http://www.wikidata.org/entity/Q1330402",
              "DBpedia": "http://dbpedia.org/resource/Microbiota"
        }
    }
            
    dict2 = { 'http://dbpedia.org/resource/Microbiota' :[
         {'keyword': 'Microbiota', 'language': 'ca'}, 
         {'keyword': 'Microbiota', 'language': 'en'}, 
         {'keyword': 'Microbioma', 'language': 'es'}
         ]
         }
    
    print(merge_dicts(dict1, dict2))
    

    【讨论】:

    • 是的,这就是我需要的,但我不明白为什么在某些情况下它没有在列表中写入任何内容。另外,有些情况下,由于找不到单词的URI,所以将其作为字典标识符返回。我将编辑问题并举出我说的例子。
    • 你的意思是"DBpedia": None 吗? (而不是"DBpedia": null
    • @drakitus98 你在吗?
    • 您好,对不起。我终于设法解决了这个问题,但我以不同的方式解决了这个问题。我所做的是使用我拥有的用于构建字典的函数将第一个字典的结果与 DBpedia 上的查询给我的结果进行比较。比较后,我将它们添加到列表中。你教给我的东西对我有很大帮助,非常感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-14
    • 2011-05-05
    • 1970-01-01
    相关资源
    最近更新 更多