识别两个列表或词典中重复项的最佳方法?

时间:2019-11-08 01:22:07

标签: dictionary python-3.7

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

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是键,list 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中的对应值上。

1 个答案:

答案 0 :(得分:0)

在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