如何反转字典结构:以Zendesk缺失翻译区域为键、文章ID为值
问题:反转Zendesk翻译缺失数据的字典结构
我正在使用Zendesk API生成包含文章缺失翻译信息的CSV文件。目前的流程是遍历文章ID列表构建API的GET请求:
article_ids = [001, 002, 003] def get_missing_translations_per_article(id): url = base_url + f"/api/v2/help_center/articles/{id}/translations/missing" response = requests.get(url, auth = (user, pwd)) json = response.json() for id in article_ids: get_missing_translations_per_article(id)
API返回的响应是对应文章ID的缺失区域列表:
{ "locales": [ "fr", "es", "de" ], "default_locale": "en" }
基于这些数据,我创建了以文章ID为键、缺失区域列表为值的字典:
base_dict = {"001":["locale1","locale2","locale3"], "002":["locale1","locale2","locale3"]}
为了让CSV对翻译人员更实用,我需要反转字典结构:以区域为键,值为该区域缺失翻译的文章ID列表,最终效果如下:
final_dict = {"locale1":["id1","id2","id3"], "locale2":["id1","id2","id3"]}
手动适配50+个区域效率极低,求高效实现方法。
解决方案
方法1:使用collections.defaultdict(简洁高效)
借助collections模块的defaultdict可以自动初始化列表类型的值,无需手动判断键是否存在:
from collections import defaultdict base_dict = {"001":["locale1","locale2","locale3"], "002":["locale1","locale2","locale3"]} final_dict = defaultdict(list) # 遍历原字典,反转键值关系 for article_id, missing_locales in base_dict.items(): for locale in missing_locales: final_dict[locale].append(article_id) # 可选:将defaultdict转换为普通字典 final_dict = dict(final_dict)
方法2:使用普通字典(无需额外模块)
如果不想引入外部模块,用基础字典操作也能实现:
base_dict = {"001":["locale1","locale2","locale3"], "002":["locale1","locale2","locale3"]} final_dict = {} for article_id, missing_locales in base_dict.items(): for locale in missing_locales: # 若区域不在字典中,先初始化空列表 if locale not in final_dict: final_dict[locale] = [] final_dict[locale].append(article_id)
生成实用的CSV文件
拿到反转后的final_dict后,可通过csv模块生成翻译人员易读的CSV,推荐两种格式:
格式1:每行一条缺失记录(便于筛选排序)
import csv with open('missing_translations.csv', 'w', newline='', encoding='utf-8') as f: writer = csv.writer(f) writer.writerow(['区域', '缺失翻译的文章ID']) for locale, article_ids in final_dict.items(): for article_id in article_ids: writer.writerow([locale, article_id])
格式2:按区域分组展示(汇总视角)
import csv with open('missing_translations_grouped.csv', 'w', newline='', encoding='utf-8') as f: writer = csv.writer(f) writer.writerow(['区域', '缺失翻译的文章ID列表']) for locale, article_ids in final_dict.items(): writer.writerow([locale, ', '.join(article_ids)])
内容的提问来源于stack exchange,提问作者Jelz
相关产品推荐
相关产品推荐

