我先从一个例子开始:
lists_dict = { 1: [('64', 'R'), ('0', 'n'), ('0', 'M')],
2: [('64', 's'), ('0', 'r'), ('0', 'M')],
3: [('64', 'R'), ('0', 'n'), ('0', 'M')],
4: [('64', 'I'), ('0', 'S'), ('0', 'N')] }
这是字典在我的任务中的样子,我的目标是将列表中的每个元素与另一个列表中具有相同索引的元素进行比较,如果该元素不存在于任何其他列表中列出任何内容,然后该键将获得另一个值,该值将是一个 int。每出现一个额外的唯一元组,int 就会增加 +1。 所以在我们的例子中,输出如下:
1: [('64', 'R'), ('0', 'n'), ('0', 'M')],0 #(no unique)
2: [('64', 's'), ('0', 'r'), ('0', 'M')],2 #(two unique tuples)
3: [('64', 'R'), ('0', 'n'), ('0', 'M')],0 #(no unique
4: [('64', 'I'), ('0', 'S'), ('0', 'N')], 3 #(unique, no other list have these values)
现在这只是一个例子,字典有 400 个键,每个列表中的元素数量是 22(22 个元组,其中有两个值)
我一直在努力解决这个问题,但我一无所获,我能得到什么帮助吗?
我试过遍历每个列表中的第一个元素然后比较它们,但感觉这不是解决这个问题的低效方法。
您可以使用 Counter 类来确定每个元组在整个字典中出现的次数。然后通过对每个列表中的元组进行计数来构建结果,这些元组的计数正好是一个。
from collections import Counter
counts = Counter(t for lst in map(enumerate,lists_dict.values()) for t in lst)
result = { k:(lst,sum(counts[t]==1 for t in enumerate(lst)))
for k,lst in lists_dict.items() }
print(result)
{1: ([('64', 'R'), ('0', 'n'), ('0', 'M')], 0),
2: ([('64', 's'), ('0', 'r'), ('0', 'M')], 2),
3: ([('64', 'R'), ('0', 'n'), ('0', 'M')], 0),
4: ([('64', 'I'), ('0', 'S'), ('0', 'N')], 3)}
循环主要的字典项目。对于每个字典元素,获取所有其他字典元素的列表。然后对于当前项中的每个元组,测试其他元素中的任何对应元组是否匹配。然后用
sum()
算出在这个测试中有多少是唯一的。
result = {}
for key, value in lists_dict.items():
other_values = [l for key2, l in lists_dict.items() if key2 != key]
result[key] = sum(not any(value[i] == l[i] for l in other_values)
for i in range(len(value)))