一个更聪明的函数来决定 C 是否是 S 的精确覆盖?
A smarter function to decide if C is an exact cover of S?
到目前为止,代码可以正常工作,但是 split、new-list 和 map 的所有这些功能只会让代码变得更难。是否混合了 set comparisons/differences 来执行与我的代码相同的功能?
编辑:new_list 等所有这些函数旨在准备 C 中的集合列表,以便能够通过循环传递它。循环确保
1.All s中的元素存在于c中
2.The 第二部分确保解决方案中没有重复元素。 (eg. if len(c) == len(set(new_list)
我想我刚刚在这里发现了一个语义错误。
3.Use set(new_list) == set(s)
以确保无论顺序如何,两组都相等。
import re
s = [2,4,8]
c = [[2], [4], [2, 4]]
new_list = (re.sub("[^0-9,]", "", str(c)))
new_list = new_list.split(',')
new_list = list(map(str, new_list))
if ('') in new_list:
del new_list[new_list.index('')]
new_list = list(map(int, new_list))
if all(elem in new_list for elem in s):
if len(c) == len(set(new_list)):
if set(new_list) == set(s):
print('This is a Yes solution')
else:
print('This is a No solution')
你做的工作太多了。
- 扁平化 更容易通过列表理解来完成。
- 只比较集合相等即可,不需要单独进行
all elem
检查,因为已经保证集合是否相等。
def exact_cover(s, c):
c_flat = [item for sub in c for item in sub]
c_set = set(c_flat)
return len(c_set) == len(c_flat) and c_set == set(s)
到目前为止,代码可以正常工作,但是 split、new-list 和 map 的所有这些功能只会让代码变得更难。是否混合了 set comparisons/differences 来执行与我的代码相同的功能?
编辑:new_list 等所有这些函数旨在准备 C 中的集合列表,以便能够通过循环传递它。循环确保
1.All s中的元素存在于c中
2.The 第二部分确保解决方案中没有重复元素。 (eg. if len(c) == len(set(new_list)
我想我刚刚在这里发现了一个语义错误。
3.Use set(new_list) == set(s)
以确保无论顺序如何,两组都相等。
import re
s = [2,4,8]
c = [[2], [4], [2, 4]]
new_list = (re.sub("[^0-9,]", "", str(c)))
new_list = new_list.split(',')
new_list = list(map(str, new_list))
if ('') in new_list:
del new_list[new_list.index('')]
new_list = list(map(int, new_list))
if all(elem in new_list for elem in s):
if len(c) == len(set(new_list)):
if set(new_list) == set(s):
print('This is a Yes solution')
else:
print('This is a No solution')
你做的工作太多了。
- 扁平化 更容易通过列表理解来完成。
- 只比较集合相等即可,不需要单独进行
all elem
检查,因为已经保证集合是否相等。
def exact_cover(s, c):
c_flat = [item for sub in c for item in sub]
c_set = set(c_flat)
return len(c_set) == len(c_flat) and c_set == set(s)