2016-09-17 508 views
1

我是一個新手Python學生,我正在經歷一些簡單的(但現在,對我來說,複雜的)練習。我嘗試了很多方法,但我決定停止猜測,因爲我相信這不是一個理智的學習過程。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:對不起,我的英語:)

+0

'lst [i] [ - 1]'表示獲得'lst'的項目'i',然後獲得_that_項目的最後一項。所以如果'lst = ['sky','you','use','ear','right']',那麼'lst [2]'是''use'',並且lst [2] [ - 1] ''''''''''''',是'use'的最後一個字母。 –

+0

非常感謝! :) – Nutshell93

+0

如果其中一個答案解決了您的問題,您應該接受它(單擊相應答案旁邊的複選標記)。這有兩件事。它讓每個人都知道你的問題已經得到解決,讓你滿意,並且它可以幫助你幫助你。請參閱[此處](http://meta.stackexchange.com/a/5235)以獲取完整說明。 –

回答

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循環中做到這一點。
  • 儘管您在else聲明中增加了cont變量,但它總是會將其與a中的相同字符串進行比較。

其他輸入:

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

輸出:

None 

希望它會幫助你。

+0

@PM 2Ring我知道,但我有習慣,因爲'C++'。我會更新..謝謝反正。 –

+0

非常感謝你! – Nutshell93

1

當你需要測試的每一個字在lst對所有其他字lst,但是這不是我們想在這裏你會使用雙for循環。我們只需要一個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。有些人認爲像這樣的「單線」更多是Pythonic,但實際上讓代碼儘可能易讀是更爲Pythonic。 :)

+0

「當你需要對第一個字中的每一個單詞進行測試時,你會使用double for循環」。你的意思是像組合!? – Nutshell93

+0

@ Nutshell93:是的,如果你想用'lst'中的所有單詞來做一些事情,你可以使用一個雙'for'循環,而不是相鄰的單詞。但是,'itertools'模塊可以使用一個'for'循環來創建各種組合和排列。 –

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'] 
+0

非常感謝你! – Nutshell93

相關問題