Python 字典配对并使用字典检查反对称性

Python dictionary to pairs and check for antisymmetry using dictionary

我正在尝试在 python 中编写三个函数。第一个接受有序对列表作为输入并将其转换为字典 pairs2dict。第二个将字典转换为有序对 dict2pairs 的列表。第三个接受表示为输入字典的关系,如果关系是反对称的,则 returns 为真,否则为假 is_antisymmetric。我想我将其解释为好像 (key,value) 存在于字典中,那么我必须检查 (value,key) 对在字典 keys/values.

的其他地方不存在

我对 python 很陌生,到目前为止我尝试过的代码 none 都有效。我发现了一些关于将字典转换为有序对的问题,但它是针对特定字典的,我希望有一个函数可以处理任何字典输入。以下是每个函数的一些示例输入和输出:

relation1 = [(0,0), (0,1), (1,1), (2,1), (2,2)]
pairs2dict(relation1)
{0: [0, 1], 1:[1], 2: [1, 2]}
is_antisymmetric(relation1)
True

relation2 = {0: [1, 2], 1: [3, 4], 2: [2,3], 3: [ ], 4: [ ]}
dict2pairs(relation2)
[(0,1), (0,2), (1,3), (1,4), (2,2), (2,3)]
is_antisymmetric(relation2)
True

relation3 = {'Jerry': ['George', 'Elaine'], 'Elaine':['Kramer']} 
dict2pairs(relation3)
[('Jerry', 'George'), ('Jerry', 'Elaine'), ('Elaine', 'Kramer')] 

我该怎么做?

我认为你可以使用 defaultdict 列表

来解决这个问题
from collections import defaultdict

对于pairs2dict,我们可以使用defaultdict:

def pairs2dict(relation):
    d = defaultdict(list)
    for item in relation:
        d[item[0]].append(item[1])
    return d

>>> relation1 = [(0,0), (0,1), (1,1), (2,1), (2,2)]
>>> pairs2dict(relation1)
defaultdict(<type 'list'>, {0: [0, 1], 1: [1], 2: [1, 2]})
>>> relation2 = pairs2dict(relation1)

对于dict2pairs,我们可以使用上面得到的defaultdict,或者使用另一个普通字典作为列表理解中的输入:

def dict2pairs(relation):
    return [(x, y) for x in relation for y in relation[x]]

>>> dict2pairs(relation2)
[(0, 0), (0, 1), (1, 1), (2, 1), (2, 2)]
>>> relation2 = {0: [1, 2], 1: [3, 4], 2: [2,3], 3: [ ], 4: [ ]}
>>> dict2pairs(relation2)
[(0, 1), (0, 2), (1, 3), (1, 4), (2, 2), (2, 3)]

对于 is_antisymmetric,一个简单的嵌套 for 循环应该可以解决问题:

def is_antisymmetric(relation):
    for key, values in relation.iteritems():
        for value in values:
            if value in relation and key in relation[value]:
                return False
    return True

>>> relation2 = {0: [1, 2], 1: [3, 4], 2: [2,3], 3: [ ], 4: [ ]}
>>> is_antisymmetric(relation2)
False
>>> relation2 = pairs2dict(relation1)
>>> is_antisymmetric(relation2)
False

请注意,

的输出
relation3 = {'Jerry': ['George', 'Elaine'], 'Elaine':['Kramer']} 
dict2pairs(relation3)
[('Jerry', 'George'), ('Jerry', 'Elaine'), ('Elaine', 'Kramer')] 

不会总是相同的,因为在 python 中字典没有排序。 (要订购字典,请使用 collections.OrderedDict

事实上,我得到了输出

>>> relation3 = {'Jerry': ['George', 'Elaine'], 'Elaine':['Kramer']} 
>>> dict2pairs(relation3)
[('Elaine', 'Kramer'), ('Jerry', 'George'), ('Jerry', 'Elaine')]

其中元素相同但顺序不同。