【问题标题】:Defining a function to find the unique palindromes in a given string定义一个函数来查找给定字符串中的唯一回文
【发布时间】:2020-02-22 03:47:56
【问题描述】:

我对 python 有点陌生。我正在尝试定义一个函数,当被问到时,它只会输出唯一的单词,这些单词是字符串中的回文。

我使用casefold() 使其不区分大小写并使用set() 仅打印唯一性。

这是我的代码:

def uniquePalindromes(string):
    x=string.split()
    for i in x:
        k=[]
        rev= ''.join(reversed(i))
        if i.casefold() == rev.casefold():
            k.append(i.casefold())
            print(set(k))
        else:
            return

我试过运行这条线

print( uniquePalindromes('Hanah asked Sarah but Sarah refused') )

预期的输出应该是['hanah','sarah'],但它只返回{'hanah'}作为输出。请帮忙。

【问题讨论】:

  • sarah 不是回文。 'sarah' != 'haras'.
  • 你没有返回任何东西。一个简单的“return”返回Nonereturn k

标签: python-3.x function palindrome


【解决方案1】:

你的逻辑是合理的,你的功能主要是做你想做的事。部分问题在于您如何返回 东西 - 您所做的只是打印每个单词的集合。例如,当我采用您现有的代码并执行此操作时:

>>> print(uniquePalindromes('Hannah Hannah Alomomola Girafarig Yes Nah, Chansey Goldeen Need log'))
{'hannah'}
{'alomomola'}
{'girafarig'}
None

hannahalomomolagirafarig 是我希望看到的回文,但它们没有以我期望的格式给出。一方面,它们被打印,而不是返回,另一方面,这是一个接一个地发生的。

该函数正在返回None,而您正在尝试打印它。这不是我们想要的。


这是您的函数的固定版本:

def uniquePalindromes(string):
    x=string.split()
    k = []  # note how we put it *outside* the loop, so it persists across each iteration without being reset
    for i in x:
        rev= ''.join(reversed(i))
        if i.casefold() == rev.casefold():
            k.append(i.casefold())  
            # the print statement isn't what we want
        # no need for an else statement - the loop will continue anyway
    # now, once all elements have been visited, return the set of unique elements from k
    return set(k)

现在它大致返回您所期望的 - 一个包含多个单词的 single 集合,而不是打印多个集合,每个集合一个单词。然后,我们可以打印该集合。

>>> print(uniquePalindromes("Hannah asked Sarah but Sarah refused"))
{'hannah'}
>>> print(uniquePalindromes("Hannah and her friend Anna caught a Girafarig and named it hannaH"))
{'anna', 'hannah', 'girafarig', 'a'}

【讨论】:

  • 如果我正在处理的字符串中没有回文,有没有办法返回一个空集。我认为使用 return none 会有所帮助,但它没有按计划工作。
  • @JBlack 我的更新版本实际上会这样做!试试print(uniquePalindromes("there are no palindromes in this sentence")),它将打印set()——一个空集。发生这种情况是因为,如果没有回文,则列表 k 中没有添加任何内容,因此我们从中创建的集合是空的。
  • 我正在尝试以相反的字典顺序打印一组,所以我将代码更改为:def uniquePalindromes(string): x=string.split() k=[] for i in x: rev= ''.join(reversed(i)) if i.casefold() == rev.casefold(): k.append(i.casefold()) k=sorted(k,reverse=True) return list(set(k)) 。但这是返回 'anna','hannah' 而不是 'hannah','anna'。这是错误的做法吗?
  • @JBlack 将其放入set 可能会弄乱排序。我会先进行从集合到列表的转换,例如return sorted(list(set(k)), reverse=True)
【解决方案2】:

如果我给你一些建议,他们不会喜欢我的。但是尝试将字符(不是空格)的数量分成 2。如果每边的数量不相等,那么您必须处理奇数数量的字母。这意味着您应该能够遍历从中间向下和从中间向上的回文,将这些字母比较在一起并将中间点用作“跳出”点。希望这会有所帮助

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-12-29
    • 2023-03-15
    • 1970-01-01
    • 2021-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多