【问题标题】:how to find words in a sentence that have even reverse of those words in python如何在一个句子中找到甚至与python中的那些单词相反的单词
【发布时间】:2020-06-23 03:37:06
【问题描述】:

我想在同一个句子中找到所有单词颠倒的单词。 然而,我得到的代码只找到了这个词的第一次出现。 在我的句子“我要吃 ma 和 tae 也会去”中,我应该得到 am(ma 是反转词)和 eat(tae 是反转词)的输出。我只得到 am ..如何修改此代码以获取其中包含反转单词的所有单词,即 am 和 eat。

input_str='i am going to eat ma and tae will also go'
word=input_str.split()
def isReverseEqual(s1, s2): 

    # If both the strings differ in length 
    if len(s1) != len(s2): 
        return False

    l = len(s1) 

    for i in range(l): 

        # In case of any character mismatch 
        if s1[i] != s2[l-i-1]: 
            return False
    return True
def getWord(str, n): 
    reverse=[]
    # Check every string 
    for i in range(n-1): 

        # Pair with every other string 
        # appearing after the current string 
        for j in range(i+1, n): 

            # If first string is equal to the 
            # reverse of the second string 
            if (isReverseEqual(str[i], str[j])): 
                reverse.append(str[i])
                return reverse 


    # No such string exists 
    return "-1"
print(getWord(word, len(word))) 

输出: ['am','eat'] 是预期的。

【问题讨论】:

  • 在我看来,这项活动在技术上无法 100% 正确完成。如果你输入单词“deal”但你真的想要单词“lead”会发生什么。
  • 您期待的是['am','eat'] 而不是['ma', 'tea'],因为ameat 出现在句子的首位?或者预期输出的顺序无关紧要?

标签: python


【解决方案1】:

你可以使用:

words = input_str.split()

s = set()
result = set()
for w in words:
    r = w[::-1]
    if r in s:
        result.add(r)
    else:
        s.add(w)

list(result)

输出:

['am', 'eat']

这是 O(n) 时间复杂度解决方案,因此您必须首先获取单词并遍历它们,每次您有一个新单词时,您都将他添加到一个集合中,如果相反的单词已经在您的集合中正在将反向添加到结果中

【讨论】:

    【解决方案2】:

    只需更改“return reverse”行的缩进即可:

    input_str='i am going to eat ma and tae will also go'
    word=input_str.split()
    def isReverseEqual(s1, s2):
    
        # If both the strings differ in length
        if len(s1) != len(s2):
            return False
    
        l = len(s1)
    
        for i in range(l):
    
            # In case of any character mismatch
            if s1[i] != s2[l-i-1]:
                return False
        return True
    def getWord(str, n):
        reverse=[]
        # Check every string
        for i in range(n-1):
    
            # Pair with every other string
            # appearing after the current string
            for j in range(i+1, n):
    
                # If first string is equal to the
                # reverse of the second string
                if (isReverseEqual(str[i], str[j])):
                    reverse.append(str[i])
        if reverse:
            return reverse
        else:    # No such string exists
            return "-1"
    print(getWord(word, len(word)))
    

    【讨论】:

      【解决方案3】:

      您的解决方案过于复杂。比如函数isReverseEqual可以写成一行:

      def isReverseEqual(s1, s2):
          return s1==s2[::-1]
      

      让我们简化它。首先,将您的句子视为一个集合,而不是一个列表,因为集合查找更有效:

      words = set(input_str.split())
      

      接下来,如果它们的反向副本也在集合/列表中,则从集合/列表中选择单词并且它们按字母顺序小于反向副本(以避免重复):

      [w for w in words if w[::-1] in words and w < w[::-1]]
      #['am', 'eat']
      

      此解决方案也适用于列表。

      【讨论】:

        【解决方案4】:
        input_str= 'i am going to eat ma and tae will also go'
        words_list = input_str.split()
        new_words_list = [word[::-1] for word in words_list]
        
        data = []
        for i in words_list:
            if len(i) > 1 and i in new_words_list:
                data.append(i)
        

        输出:

        ['am', 'eat', 'ma', 'tae']
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2019-04-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-01-27
          相关资源
          最近更新 更多