【问题标题】:Best way to identify duplicates in two lists or a dictionary?识别两个列表或字典中重复项的最佳方法?
【发布时间】:2019-11-08 01:22:07
【问题描述】:

假设您有两个列表,例如:

list1 = [-2, -1, 0, 1, 2, 3]
list2 = [4, 1, 0, 1, 4, 9]

...两个列表被压缩到字典中生成:

dict1 = {-2: 4, 
         -1: 1, 
          0: 0, 
          1: 1, 
          2: 4, 
          3: 9}

...其中 list1 是键,列表 2 是值。

您会注意到 list2 中的某些元素是重复的,例如 4 和 1。它们在列表 2 中出现了两次,因此出现在字典中。

-2 corresponds to 4
 2 corresponds to 4
-1 corresponds to 1
 1 corresponds to 1

我正在尝试找出一种方法使用列表或字典来识别 list2 中的重复项,并从列表 1 中返回它们的键。

所以我期望从上面的两个列表中返回的值是:

(-2, 2) #From list 1 since they both correspond to 4 in list2
(-1, 1) #from list 1 since they both correspond to 1 in list2

在这个例子中,list2 恰好是 list1 的平方。但情况并非总是如此。

所以最终,我正在寻找一种基于重复值返回这些键的方法。

关于如何解决这个问题的任何想法?我能够识别 list2 中的重复项,但我完全不知道如何在列表 1 中识别它们的对应值。

【问题讨论】:

  • 你能重新提出这个问题吗?完全糊涂了
  • 我重新整理了这个问题,如果造成混淆,请见谅!
  • 您有重复项(groupby,其中 count >1,选择或屈服)。对于 list2 中的每个重复项,您可以生成所有对应的键。
  • @Soleil 我是否在列表 2 上分组?这将如何产生 list1 中的值?

标签: dictionary python-3.7


【解决方案1】:

在python3中:

from itertools import groupby
list1 = [-2, -1, 0, 1, 2, 3]
list2 = [4, 1, 0, 1, 4, 9]
pairs = zip(list2, list1)
ordered = sorted(pairs, key=lambda x: x[0])
groups = ((k, list(g)) for k,g in groupby(ordered, key=lambda x: x[0])) # generator
duplicates = (k for k in groups if len(k[1])>1) # generator
for k,v in duplicates :
    print(str(k) + " : " + str(list(v)))

结果:

1 : [(1, -1), (1, 1)]
4 : [(4, -2), (4, 2)]

奖励:在函数式 c# 中:

var list1 = new[] { -2, -1, 0, 1, 2, 3 };
var list2 = new[] { 4, 1, 0, 1, 4, 9 };
var g = list1.Zip(list2, (a, b) => (a, b)) //create tuples
    .GroupBy(o => o.b, o => o.a, (k, group) => new { key = k, group = group.ToList() }) //create groups
    .Where(o => o.group.Count > 1) // select group with minimum 2 elements
    .ToList(); // no lazy
foreach (var kvp in g)
    Console.WriteLine($"{kvp.key}: {string.Join(",", kvp.group)}");

结果:

4: -2,2
1: -1,1

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-15
    • 2017-04-16
    • 2023-01-28
    • 2011-11-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多