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')]
其中元素相同但顺序不同。
我正在尝试在 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')]
其中元素相同但顺序不同。