【问题标题】:Finding if a list of words contains the reverse of a word查找单词列表是否包含单词的反转
【发布时间】:2020-03-29 18:21:47
【问题描述】:

给定一个列表,例如

['table', 'drawer', 'chair', 'reward', 'radar']

您将如何创建一个函数/for 循环,以返回在列表中具有相反词的单词列表?我试图只包含给定单词的第一个实例

所以结果是:

['drawer', 'radar']

而不是

['drawer','reward', 'radar']

到目前为止,我的代码返回后一个结果:

def find_reversals(lst):

    emptylst = []
    match = []

    for word in lst:
        new = word[::-1]
        emptylst.append(new)

    for i in lst:
        for j in emptylst:
            if i == j:
                match.append(i)

    print('{}'.format(match))

【问题讨论】:

  • 为什么'radar' 在最后的列表中?回文应该不加检查就加?

标签: python list for-loop reverse


【解决方案1】:

您可以执行以下操作:

lst = ['table', 'drawer', 'chair', 'reward', 'radar']
s = set(lst)

result = []
for word in lst:
    reverse = word[::-1]
    if reverse in s:
        result.append(word)
    s.remove(word)

print(result)

输出

['drawer', 'radar']

由于它使用集合,复杂度为O(n),其中n 是列表中元素的数量。

【讨论】:

  • 这不是O(n),因为反转字符串不是恒定的。假设你最长的字符串是s,那么时间复杂度是O(n*s)
  • @Chrispresso,正如我所说的 O(n) 仅取决于列表中的元素数量。但是你是对的,如果你想考虑复杂度中的字符串
  • 在哈希冲突的(非常极端的)情况下肯定是O(n^2)
  • @MinionJim,可能是这样,但平均情况是 O(n)。但是是的,最坏的情况是 O(n)
【解决方案2】:

您可以使用两个索引迭代列表,ij 其中ji 开始(只要您希望回文计数)

found = set()
a = ['table', 'drawer', 'chair', 'reward', 'radar']
ret = []
for i in range(len(a)): 
    for j in range(i, len(a)): 
       if a[j][::-1] == a[i]: 
           word = ''.join(sorted(a[i])) 
           if word not in found: 
               found.add(word) 
               ret.append(a[i])

# ret = ['drawer', 'radar']

您的重复计算的原因是因为您没有跟踪是否找到了某些东西。在这种情况下,我通过 set 和该单词的排序顺序来跟踪它。

【讨论】:

    【解决方案3】:

    这是一个没有集合和多个 for 循环的解决方案:

    lst = ['table', 'drawer', 'chair', 'reward', 'radar']
    result = []
    
    for e in lst:
        new_word = e[::-1]    #Make a reverse of a word
        if new_word in lst:
            if e not in result and e[::-1] not in result:    #Check if the word, or a reversed word is in the list, and if not, put it in a list
                result.append(e)
    
    print(result)
    

    【讨论】:

      猜你喜欢
      • 2018-04-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-02-21
      • 2017-10-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多