首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从给定的字符串列表中打印所有排列,这样每组字符串都是完全唯一的。

从给定的字符串列表中打印所有排列,这样每组字符串都是完全唯一的。
EN

Code Review用户
提问于 2018-01-22 17:12:35
回答 1查看 1.6K关注 0票数 1

问题:给出一个字符串列表,其中一些可能是它们之间的字谜,打印可以构造成这样的排列,以便每个置换都有一组完全唯一的字符串。

输入:“asda”、“daas”、“dand”、“nadd”

代码语言:javascript
复制
output :  {“asda”, “dand”}, {“daas”, “dand”}, {“asda”, “nadd”}, {“daas”, “nadd”}

输入:“膝上型电脑”、“toplap”、“嘟嘟”、“鼠标”

代码语言:javascript
复制
output :  {“laptop”, “mouse”}, {“toplap”, “mouse”}, {“loptap”, “mouse”}

代码:

代码语言:javascript
复制
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"])

虽然代码给出了正确的输出,但它复制了集合。我怎样才能消除这个缺陷?

EN

回答 1

Code Review用户

发布于 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]})

你好像逆向设计了一个与我完全不同的规格。我很确定有一些输入应该有两个以上的元素。

如果我对规范的理解是正确的,那么应该有一个阶段将输入字符串聚集成等价类,然后另一个阶段计算所有等价类的笛卡尔积。

票数 1
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/185699

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档