问题:给出一个字符串列表,其中一些可能是它们之间的字谜,打印可以构造成这样的排列,以便每个置换都有一组完全唯一的字符串。
输入:“asda”、“daas”、“dand”、“nadd”
output : {“asda”, “dand”}, {“daas”, “dand”}, {“asda”, “nadd”}, {“daas”, “nadd”}输入:“膝上型电脑”、“toplap”、“嘟嘟”、“鼠标”
output : {“laptop”, “mouse”}, {“toplap”, “mouse”}, {“loptap”, “mouse”}代码:
def is_anagram(value_1, value_2):
"""checks whether the two given strings are anagrams """
if sorted(value_1) == sorted(value_2):
return True
def random_set(input_value):
"""returns the set of strings which are completely unique"""
if len(input_value) <= 2:
output = input_value
else:
output = []
for i in range(len(input_value)):
for j in range(len(input_value)):
if not is_anagram(input_value[i], input_value[j]):
output.append( {input_value[i], input_value[j]})
return output
print random_set(["asda", "daas" , "dand" , "nadd"])
print random_set(["laptop", "toplap", "loptap", "mouse"])虽然代码给出了正确的输出,但它复制了集合。我怎样才能消除这个缺陷?
发布于 2018-01-23 15:50:47
问题:给出一个字符串列表,其中一些可能是它们之间的字谜,打印可以构造成这样的排列,以便每个置换都有一组完全唯一的字符串。
这是一种残暴的规格。在开始编写代码之前,IMO需要花更多的时间收集需求。事实上,我们不得不尝试从两个测试用例中反向设计需求。
输入:“asda”、“daas”、“dand”、“nadd”输出:{“asda”、“dand”}、{“daas”、“dand”}、{“asda”、“nadd”}、{“daas”、“nadd”}
由于{"asda", "dand"}包含在输出中,而{"dand", "asda"}却没有,显然置换是错误的。
至于“唯一性”,从例子中可以看出,真正的意思是,输出集合中没有一个应该包含两个彼此之间的字谜词。
最后,我注意到,在这个假设下,所有的输出集都是最大的,尽管问题陈述中没有任何暗示。
所以真正的要求似乎是
给定一个字符串列表,其中一些字符串可能是对方的字谜,输出一个包含每个不包含两个单词的最大子集的列表。
其他答案已经在is_anagram上发表了评论,我没有什么要补充的。
def random_set(input_value):
这是一个误导的名称:它强烈地暗示返回值是单个集合,而实际上它应该是一个集合列表。
"""returns the set of strings which are completely unique"""
不,它没有。如果是这样的话,实现就是return set(input_value)。
if len(input\_value) <= 2: output = input\_value
我不认为Python样式指南禁止早期返回,而且要理解早期返回比对变量赋值要容易得多,而变量在很长一段时间内不会再次使用。
还有,这是辆马车。考虑一下测试用例["asda", "daas"],它应该返回[{"asda"}, {"daas"}]。
事实上,这显然是错误的,因为它不返回与else情况相同的类型。一个分支返回字符串列表,另一个分支返回字符串集列表。
else: output = [] for i in range(len(input\_value)): for j in range(len(input\_value)): if not is\_anagram(input\_value[i], input\_value[j]): output.append( {input\_value[i], input\_value[j]})
你好像逆向设计了一个与我完全不同的规格。我很确定有一些输入应该有两个以上的元素。
如果我对规范的理解是正确的,那么应该有一个阶段将输入字符串聚集成等价类,然后另一个阶段计算所有等价类的笛卡尔积。
https://codereview.stackexchange.com/questions/185699
复制相似问题