2016-08-02 72 views
11

我有一種感覺,我會被告知去「初學者指南」或你有什麼,但是我有這裏的代碼爲第三個列表中給定數量的元素返回兩個列表之間的字符串匹配

does = ['my','mother','told','me','to','choose','the'] 
it = ['my','mother','told','me','to','choose','the'] 
work = [] 

while 5 > len(work): 
    for nope in it: 
     if nope in does: 
      work.append(nope) 

print (work) 

我也得到

['my', 'mother', 'told', 'me', 'to', 'choose', 'the'] 

這是爲什麼?我如何說服它返回

['my', 'mother', 'told', 'me'] 
+0

這就好比一個交集(截斷),儘管集合沒有順序。 – smci

+0

請注意,使用'while 5> len(work)'命令被許多人看作是不合邏輯的,導致了[「yoda conditions」](https://en.wikipedia.org/wiki/Yoda_conditions)的名稱。這當然是正確的任何方式:) –

+0

@WilliamCorrigan你應該接受你發現的答案,有助於向其他讀者指出什麼幫助解決了你的問題。 – idjaw

回答

8

你可以嘗試這樣的事:

for nope in it: 
    if len(work) < 5 and nope in does: 
     work.append(nope) 
    else: 
     break 

與您的代碼的問題是,它的工作長度的檢查,通過所有具有循環後it的項目,並添加了所有does

+0

比我的解決方案更優化,更清晰。我刪除了我的信息,以確保您的信息被清楚地看作是最受歡迎的解決方案。 +1 – idjaw

+0

@idjaw非常感謝你!不需要刪除你的答案:) – Christos

+0

對於這種情況,我比你更喜歡你的解決方案,並希望OP看到同樣的結果。 :) – idjaw

1

你可以這樣做:

does = ['my','mother','told','me','to','choose','the'] 
it = ['my','mother','told','me','to','choose','the'] 
work = [] 
for nope in it: 
    if nope in does: 
     work.append(nope) 
work = work[:4] 
print (work) 

這只是使得列表而不檢查長度,然後切割它,只留下4個第一要素。

1

另外,留一點點接近你原來的邏輯:

i = 0 
while 4 > len(work) and i < len(it): 
    nope = it[i] 
    if nope in does: 
     work.append(nope) 
    i += 1 

# ['my', 'mother', 'told', 'me', 'to'] 
0

只是爲了好玩,這裏是一個一行沒有進口:

does = ['my', 'mother', 'told', 'me', 'to', 'choose', 'the'] 
it = ['my', 'mother', 'told', 'me', 'to', 'choose', 'the'] 
work = [match for match, _ in zip((nope for nope in does if nope in it), range(4))] 
相關問題