Search code examples
python-3.xfunctionpalindrome

Defining a function to find the unique palindromes in a given string


I'm kinda new to python.I'm trying to define a function when asked would give an output of only unique words which are palindromes in a string.

I used casefold() to make it case-insensitive and set() to print only uniques.

Here's my code:

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

I've tried to run this line

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

The expected output should be ['hanah','sarah'] but its returning only {'hanah'} as the output. Please help.


Solution

  • Your logic is sound, and your function is mostly doing what you want it to. Part of the issue is how you're returning things - all you're doing is printing the set of each individual word. For example, when I take your existing code and do this:

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

    hannah, alomomola, and girafarig are the palindromes I would expect to see, but they're not given in the format I expect. For one, they're being printed, instead of returned, and for two, that's happening one-by-one.

    And the function is returning None, and you're trying to print that. This is not what we want.


    Here's a fixed version of your function:

    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)
    

    now it returns roughly what you'd expect - a single set with multiple words, instead of printing multiple sets with one word each. Then, we can print that set.

    >>> 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'}