python中interable_在python中给定一个关系,有没有一种标准的方法将interable分区为等价类?...

我找到了John Reid的

this Python recipe.它是用Python 2编写的,我将它改编为Python 3来测试它.该配方包括一个测试,用于根据lambda x,y:(x – y)%4 == 0的关系将整数集[-3,5]划分为等价类.

它似乎做你想要的.这是我在Python 3中想要的改编版本:

def equivalence_partition(iterable, relation):

"""Partitions a set of objects into equivalence classes

Args:

iterable: collection of objects to be partitioned

relation: equivalence relation. I.e. relation(o1,o2) evaluates to True

if and only if o1 and o2 are equivalent

Returns: classes, partitions

classes: A sequence of sets. Each one is an equivalence class

partitions: A dictionary mapping objects to equivalence classes

"""

classes = []

partitions = {}

for o in iterable: # for each object

# find the class it is in

found = False

for c in classes:

if relation(next(iter(c)), o): # is it equivalent to this class?

c.add(o)

partitions[o] = c

found = True

break

if not found: # it is in a new class

classes.append(set([o]))

partitions[o] = classes[-1]

return classes, partitions

def equivalence_enumeration(iterable, relation):

"""Partitions a set of objects into equivalence classes

Same as equivalence_partition() but also numbers the classes.

Args:

iterable: collection of objects to be partitioned

relation: equivalence relation. I.e. relation(o1,o2) evaluates to True

if and only if o1 and o2 are equivalent

Returns: classes, partitions, ids

classes: A sequence of sets. Each one is an equivalence class

partitions: A dictionary mapping objects to equivalence classes

ids: A dictionary mapping objects to the indices of their equivalence classes

"""

classes, partitions = equivalence_partition(iterable, relation)

ids = {}

for i, c in enumerate(classes):

for o in c:

ids[o] = i

return classes, partitions, ids

def check_equivalence_partition(classes, partitions, relation):

"""Checks that a partition is consistent under the relationship"""

for o, c in partitions.items():

for _c in classes:

assert (o in _c) ^ (not _c is c)

for c1 in classes:

for o1 in c1:

for c2 in classes:

for o2 in c2:

assert (c1 is c2) ^ (not relation(o1, o2))

def test_equivalence_partition():

relation = lambda x, y: (x - y) % 4 == 0

classes, partitions = equivalence_partition(

range(-3, 5),

relation

)

check_equivalence_partition(classes, partitions, relation)

for c in classes: print(c)

for o, c in partitions.items(): print(o, ':', c)

if __name__ == '__main__':

test_equivalence_partition()

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值