我试图在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')]
我该怎么做?
答案 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')]
元素相同但顺序不同。