Python练习:最后一个字母/第一个字母

时间:2016-09-17 07:06:48

标签: python list function for-loop

我是一名新手Python学生,我正在经历一些简单的(但现在,对我来说,复杂的)练习。我在很多方面尝试过,但我决定不再猜测,因为我相信它不会是一个理智的学习习惯。

我必须解决以下练习:

  

写一个lastfirst(lst)函数,给定一个列表,返回   列表中的第一个单词以与...不同的字符开头   上一个单词的最后一个字符。如果没有这样的话,   返回None

     

示例:

     

lst = ['sole','elmo','orco','alba','asta']返回'alba'

     

lst = ['sky','you','use','ear','right']返回None

我试图解决它,而我所拥有的就是这个:

lst = ['sole','elmo','orco','alba','asta']

def lastfirst(lst):

    cont = 0
    d = 1 
    for a in lst[cont:]: 
        for b in lst[d:]:       
            if a[-1] != b[0]:
                return lst[d]
            else:
                 cont = cont + 1   
                 d = d + 1  

print(lastfirst(lst))

我发现的问题是:

该程序不区分第一个单词的第一个字母和第二个单词的最后一个字母,或第一个单词的最后一个字母和第二个单词的第一个字母。

PS:对不起我的英文:)

3 个答案:

答案 0 :(得分:2)

我认为它会起作用(在python 3中):

lst = ['sole','elmo','orco','alba','asta']

def lastfirst(lst):
    for i in range(len(lst)-1):
        if lst[i][-1] != lst[i+1][0] :
            return lst[i+1]
    return None
print(lastfirst(lst))

输出:

alba
  

说明(代码中需要修改):

     
      
  • 我们不需要两个for循环,我们可以单个for循环。
  •   
  • 虽然您在cont语句中增加了else变量,但它始终会将其与a的相同字符串进行比较。
  •   

另一个输入:

lst = ['sky','you','use','ear','right']

输出:

None

希望它会对你有所帮助。

答案 1 :(得分:1)

当你需要在for中对lst中的每个单词进行测试时,你会使用双lst循环,但这不是我们想要的。我们只需要一个for循环,我们需要存储前一个单词,以便我们可以针对当前单词进行测试。像这样:

def lastfirst(lst):
    if not lst:
        return None
    prev = lst[0]
    for word in lst[1:]:
        if word[0] != prev[-1]:
            return word
        prev = word
    return None


data = [
    ['sole', 'elmo', 'orco', 'alba', 'asta'], 
    ['sky', 'you', 'use', 'ear', 'right'],
    [],
    ['help', 'please', 'everybody', 'thanks'],
]

for lst in data:
    print(lastfirst(lst))

<强>输出

alba
None
None
thanks

我的功能首先

if not lst:
    return None

所以如果我们传递一个空列表,我们会立即返回。否则,程序在尝试prev = lst[0]

时会崩溃

这是使用单行进行测试的有效方法。

def lastfirst(lst):
    return next((v for u, v in zip(lst, lst[1:]) if u[-1] != v[0]), None)

这段代码显然比我以前的版本更紧凑,可能更快一些。但 更难以理解,尤其是如果您不熟悉Python。有些人认为&#34; one-liners&#34;像这样更像Pythonic,但实际上它更像Pythonic使你的代码尽可能可读。 :)

答案 2 :(得分:0)

这是使用itertools的解决方案。

首先,定义一个在满足条件时返回布尔值的函数:

def check_letters(apair):
"In a pair, check last letter of first entry with first letter of second"
    return apair[0][-1] == apair[1][0]

现在我们使用itertools module食谱中的成对函数:

import itertools
def pairwise(iterable):
    "s -> (s0,s1), (s1,s2), (s2, s3), ..."
    a, b = itertools.tee(iterable)
    next(b, None)
    return itertools.izip(a, b)

最后:

lst = ['sole','elmo','orco','alba','asta']
lstlast = [item[1] for item in pairwise(lst) if not check_letters(item)]
# returns ['alba']