如何将一个字典中的对应值作为项合并到for循环内创建的另一个字典中?
问题:如何在遍历单词列表时,为每个字典添加对应单词的出现次数?
我在处理字典和循环时遇到了一个问题:
- 我有一个统计单词出现次数的字典
wordcount,示例如下:wordcount={'sort': 3, 'count': 3, 'wrap': 3, 'coin': 11} - 我通过
for循环遍历单词列表wordlist,为每个单词调用Google N-grams接口获取统计数据,构建包含额外属性的字典results_nouns_final,核心代码如下:for word in wordlist: url =f"https://books.google.com/ngrams/json?content= {word}&year_start=1965&year_end=1975&corpus=26&smoothing=3" sleep(1) resp = requests.get(url) if resp.ok: results = json.loads(resp.content)[0] results_clean = {key: val for key, val in results.items() if key == "ngram" or key =="timeseries"} timeseries = {key: results_clean[key] for key in results_clean.keys() & {'timeseries'}} timeseriesvalues= list(timeseries.values()) timeseriesmean=np.mean(timeseriesvalues) ngramsonly = {key: results_clean[key] for key in results_clean.keys() & {'ngram'}} ngramsvalues = list(ngramsonly.values()) # 这里是出错的地方 results_nouns_final={"word": ngramsvalues, "occurrence_mean": timeseriesmean, "count": wordcount.items()} - 现在的问题是,
results_nouns_final里的count字段会包含wordcount的所有键值对,比如:
而我期望的是每个字典只对应当前单词的出现次数,比如:{'word': ['sort'], 'occurrence_mean': 5.319996372468642e-05, 'count': dict_items([('sort', 3), ('count', 3), ('wrap', 3), ('coin', 11)])}{'word': ['sort'], 'occurrence_mean': 5.319996372468642e-05, 'count': 3}
请问我哪里出错了?
解答
很简单的问题——你用错了字典的取值方式!
你现在写的wordcount.items()会返回整个字典里所有键值对的迭代器,所以每次循环都会把wordcount的全部内容塞进count字段里,这当然不是你想要的结果。
你真正需要的是当前遍历到的word对应的出现次数,直接通过字典的键访问就能拿到:
results_nouns_final={"word": ngramsvalues, "occurrence_mean": timeseriesmean, "count": wordcount[word]}
不过这里有个小坑:如果wordlist里存在wordcount中没有的单词,直接用wordcount[word]会抛出KeyError。为了让代码更健壮,推荐用get()方法,同时指定一个默认值(比如0):
results_nouns_final={"word": ngramsvalues, "occurrence_mean": timeseriesmean, "count": wordcount.get(word, 0)}
这样修改后,每次循环都会精准获取当前单词在wordcount里对应的次数,就能得到你期望的输出了!
内容的提问来源于stack exchange,提问作者Juan Alvarez Vilanova
相关产品推荐
相关产品推荐

