假设您有两个列表,例如:
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中的对应值上。
答案 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