如何用列表推导式替代嵌套循环获取各产品购买者唯一地域
用列表推导式实现产品购买者地域去重需求
首先,咱们可以先把users列表转换成字典,这样通过用户ID查找对应地域的效率会高很多(从O(n)变成O(1)),这比原循环里反复遍历users要更高效:
users_dict = {user_id: loc for user_id, loc in users}
接下来,就可以用列表推导式来生成每个产品对应的唯一地域列表了。这里我们会用到set来自动去重,如果你需要保持地域首次出现的顺序(和原代码逻辑完全一致),可以用dict.fromkeys来实现(Python 3.7+的字典是有序的):
result = [ (prod_id, list(dict.fromkeys(users_dict[user_id] for user_id in user_ids))) for prod_id, user_ids in prod ]
如果不需要严格保持地域首次出现的顺序,也可以简化成用set去重后转列表:
result = [ (prod_id, list({users_dict[user_id] for user_id in user_ids})) for prod_id, user_ids in prod ]
最后打印结果的话,直接遍历result就行:
for prod_id, locs in result: print(prod_id, locs)
运行这段代码,你会得到和原嵌套循环完全一样的输出:
1005 ['US']
1004 ['EN', 'FR', 'MX']
1003 ['US']
1002 ['MX', 'US', 'EN']
1001 ['EN', 'US', 'MX']
核心优势说明
- 用字典替代原循环里的嵌套查找,大幅提升了效率,尤其是当用户数据量很大的时候
- 列表推导式把多层嵌套循环压缩成了更简洁的结构,代码可读性也更强
- 用
dict.fromkeys(或set)来实现地域去重,比原循环里手动判断not in要更简洁高效
内容的提问来源于stack exchange,提问作者user2842122
相关产品推荐
相关产品推荐

