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

时间:2015-02-14 18:42:24

标签: python dictionary tuples

我试图在python中编写三个函数。第一个接受有序对的列表作为输入,并将其转换为字典pairs2dict。第二个将字典转换为有序对dict2pairs的列表。第三个接受表示为输入字典的关系,如果关系是反对称则返回true,否则返回false is_antisymmetric。我想我将其解释为字典中存在(key,value),然后我必须检查字典键/值中其他地方不存在(value,key)对。

我是python的新手,到目前为止我尝试过的代码都没有。我发现了一些关于将字典转换成有序对的问题,但是它适用于特定的字典,我希望有一个可以在任何字典输入上工作的函数。以下是每个函数的一些示例输入和输出:

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')] 

我该怎么做?

1 个答案:

答案 0 :(得分:1)

我认为您使用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')] 

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

实际上,我得到了输出

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

元素相同但顺序不同。