只有当我在Python3.x中添加另一个返回值时才能获得正确的输出

时间:2017-11-27 21:48:50

标签: python python-3.x

对于非特定标题感到抱歉,但我无法更好地解释它。

我有这个python代码:

def longestWord_with_recursion(wrds):
    if type(wrds) == str:
        return len(wrds),wrds
    return max([longestWord_with_recursion(x) for x in wrds])

(...)

words = [list of words]
print(longestWord_with_recursion(words))

len(wrds),wrds 的回报给出了以下内容:

(11, 'programming') #programming is the correct answer

但是,由于我只想回复这个词,我用 return wrds 替换回报,这给了我以下内容:

you #another word in the list, but the wrong one

为什么会这样?如果我添加另一个返回值,为什么它会给我正确的单词,但如果我只返回这个,那么它是不是?怎么能解决这个问题?

E:单词列表是:

  <''''','丑闻',''','教育','是','那','每一个','时间','你','教','某事','你','剥夺','a','学生','','','愉快','和','受益',''','发现','西摩','Papert', '出生','二月','29','1928','死','七月','三十一','2016','如果','调试','是',''','过程',''','删除','错误','然后','编程','必须','是',''','过程',''','推','他们', 'in','Edsger','W','Dijkstra']

3 个答案:

答案 0 :(得分:0)

当您只返回单词时,使用递归语句形成的列表只是单词列表。 “你”是列表中最大的单词(按字母顺序排在最后一个单词)。您必须返回长度,以使之前的呼叫级别对该数据进行操作。

请注意,除了句法意义之外,这不是任何递归。你的函数有两个不完全交互的不同操作:如果用字符串调用它,它会做一件事;如果使用任何其他数据类型调用它,它将迭代。除非你有嵌套的单词列表,否则这不是真正的“基本案例”和“递归案例”。

答案 1 :(得分:0)

试试这个:

def longestWord_with_recursion(wrds):
if type(wrds) == str:
    return len(wrds),wrds
return max([longestWord_with_recursion(x) for x in wrds])[1]

print(longestWord_with_recursion(words))

它返回了两个元素的列表,所以你只需要指出你要打印的元素是第二个元素!

答案 2 :(得分:0)

这似乎不正确使用递归。看起来你更像是试图用longestWord_with_recursion函数重载两个函数:

  • 将单词列表更改为(word_length, word)
  • 的元组列表
  • 根据元组列表返回最大的单词。

您可以将整个功能重写为:

def longest_word(iterable):
    return max([(len(x), x) for x in iterable])

也将返回最长的单词,同时仍然使用内置的max函数。这将返回(word_length, word)的元组,因此如果您只想返回单词,则可以执行以下操作:

def longest_word(iterable):
    return max([(len(x), x) for x in iterable])[1]

注意最后的[1]

修改

在评论中查看max的文档以及@Kenny的评论,可以更简单地使用:

def longest_word(iterable):
    return max(iterable, key=len)

此时,它真的值得成为它自己的功能吗?