在字典中创建嵌套列表,列表中没有重复项
Posted
技术标签:
【中文标题】在字典中创建嵌套列表,列表中没有重复项【英文标题】:Create nested list in dictionary without duplicates in the list 【发布时间】:2019-12-23 13:51:33 【问题描述】:我正在做一个数据库查询,例如select fruits from warehouse
。
目标是为每个仓库中的水果创建一个字典:
13: [apple, orange, grapes], 14: [banana, pineapple], 20: [strawberry, avocado, blueberry]
我想完全移除多个仓库中存在的任何水果,并且我想打印一条关于它们的错误消息。 我得到了一个可行的解决方案,但它需要几个步骤:
fruits = set()
duplicates = set()
stock =
tmp = []
for warehouse in warehouses:
for row in results:
if row[0] in fruits
print row[0] + " is a duplicate"
duplicates.add(row[0])
else
fruits.add(row[0])
tmp.append(row[0])
stock[warehouse] = tmp
tmp = []
final_result =
#Remove duplicates
for warehouse,fruits in stock.iteritems():
final_result[warehouse] = []
for fruit in fruits:
if fruit not in duplicates:
final_result[warehouse].append(fruit)
我喜欢尽可能使用 dict/list 理解,但这似乎在这里被排除了,整个方法看起来有点麻烦,有没有更好/更清洁的方法来实现相同的结果?
【问题讨论】:
什么是warehouses
,什么是results
?请查看如何生成minimal reproducible example 并阐明输入和预期输出...
每个“仓库”都是我执行查询的不同数据库主机,该查询的结果在结果中。
【参考方案1】:
是的,有,实际上可以通过推导来完成:
stock =
for warehouse in warehouses:
stock[warehouse] = []
for row in results:
stock[warehouse].append(row[0])
fruit_list = [fruit for warehouse in stock.values() for fruit in warehouse]
duplicates = fruit for fruit in set(fruit_list) if fruit_list.count(fruit) > 1
for fruit in duplicates:
print(fruit + " is a duplicate")
final_result = warehouse:[fruit for fruit in fruits if fruit not in duplicates] for warehouse,fruits in stock.items()
【讨论】:
谢谢,看起来真的很干净,但是生成重复项的集合理解似乎效率很低,因为执行时间比我原来的要长得多。 (我有大约50000个水果) 我同意你的原始代码在它的作用上相当有效,我唯一不明白的是你为什么使用tmp
变量而不是直接附加到stock[warehouse]
。
我只是没想到 :) 所以你的观点肯定有助于清理我的代码!我找到了优化您的提案的方法:fruit for fruit, number in Counter(fruit_list).items() if number > 1
(***.com/questions/52072381/…)以上是关于在字典中创建嵌套列表,列表中没有重复项的主要内容,如果未能解决你的问题,请参考以下文章