Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/vim/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 根据不同的值对字典进行分组_Python - Fatal编程技术网

Python 根据不同的值对字典进行分组

Python 根据不同的值对字典进行分组,python,Python,根据相似的值对字典进行分组很容易,但我很难想出一种相反的好方法:对其中一个键的值与其他键的值不同的字典进行分组 例如,以这些为例: a = {1: 'a', 2: 'b', 3:'c'} b = {1: 'a', 2: 'b', 3:'d'} c = {1: 'c', 2: 'b', 3:'d'} 这些可分为两组,其中一个键值不同: # Expected output: {3: {a, b}, # Differs on 3 1: {b, c}} # Differs on 1 我

根据相似的值对字典进行分组很容易,但我很难想出一种相反的好方法:对其中一个键的值与其他键的值不同的字典进行分组

例如,以这些为例:

a = {1: 'a', 2: 'b', 3:'c'}
b = {1: 'a', 2: 'b', 3:'d'}
c = {1: 'c', 2: 'b', 3:'d'}
这些可分为两组,其中一个键值不同:

# Expected output:
{3: {a, b},    # Differs on 3
 1: {b, c}}    # Differs on 1

我很难想出一个实现这种功能的好方法。关于如何继续,您有什么建议吗?

假设键和值是可散列的,您可以通过对项目使用集合来获得字典差异。然后,您可以获得一个目录对列表,以及它们的区别:

a = {1: 'a', 2: 'b', 3:'c'}
b = {1: 'a', 2: 'b', 3:'d'}
c = {1: 'c', 2: 'b', 3:'d'}

def diff_dict(dicta, dictb):
    aset = set(dicta.items())
    bset = set(dictb.items())
    diff = aset ^ bset
    return tuple(set(x[0] for x in diff))

print diff_dict(a, b)
(3,)

all_dicts = [a,b,c]

listgroup = []

for dicta, dictb in itertools.combinations(all_dicts, 2):
     key = diff_dict(dicta, dictb)
     listgroup.append((key, (dicta, dictb)))

如果只需要单个项目,请在len(key)==1时使用
选通追加

那么,预期的产出是多少?那么{a,c}@sjcipher呢?我把我期望输出的东西说得更清楚了。为什么你的输出不是
{3:{a,c},1:{a,c}}
?@doukremt:这些键所列出的dict值与变量名的字符不同,而这些键的值让我很困惑……哇,这太棒了
itertools
每次我看到它时,它似乎越来越有趣:)