在字典中创建嵌套列表,列表中没有重复项

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/…)

以上是关于在字典中创建嵌套列表,列表中没有重复项的主要内容,如果未能解决你的问题,请参考以下文章

从字典列表中创建嵌套的 json 对象

搜索特定值的嵌套字典列表[重复]

从字典列表创建DataFrame - 其中值是列表本身[重复]

从嵌套列表创建字典 [重复]

Python - 在字典列表中查找重复项并将它们分组

使用 Counter 对象从两个列表中创建字典