2013-11-04 211 views
-2
def f(p): 
    z=len(p) 
    for y in range(0,z): 
     if "t" in p[y]: 
      print(p[y]) 
    return 
list = ["titan","ton", "automatic","manual"] 
f(list) 

函數應該刪除從列表中以字母't'開頭的所有單詞。該函數然後返回該列表。這個函數只是返回一個列表,其中包含t的所有單詞。For循環列表函數

+1

它不返回任何東西。 – kindall

+2

不要使用'list'作爲變量名! – dawg

回答

1

根本沒有返回列表,只是打印它的項目。

其次,不需要使用索引來遍歷列表項,只需遍歷列表本身即可。使用

解決一個list comprehension

def f(p): 
    return [item for item in p if item.startswith('t')] 

lis = ["titan","ton", "automatic","manual"] 
new_lis = f(lis) 
print(new_lis) 
#['titan', 'ton'] 

您可以通過簡單地用yield更換print呼叫並做了一些其他改變使你的代碼工作。使用yield使得這個功能generator function

def f(p): 
    for item in p: 
     if item.startswith('t'): 
      yield item 
...    
>>> list(f(lis)) #call list on the generator expression returned by `f` to see its content 
['titan', 'ton'] 

注意in運算符用於字符串匹配,所以:

>>> "t" in "automatic" 
True 

True,如果你要檢查只是第一個字符,然後使用str.startswith

>>> "automatic".startswith('t') 
False 
6

你的問題是雙重的:

  1. 你沒有從你的函數列表中刪除項目。
  2. 你沒有從函數返回任何東西;即過濾列表。

但是,您不需要爲這項工作很大的功能。只需使用一個list comprehension過濾掉這些項目:

>>> lst = ["titan","ton", "automatic","manual"] 
>>> def func(lst): 
...  # You could also do `[x for x in lst if not x.lower().startswith("t")]` 
...  # which will also capture words starting with "T" 
...  return [x for x in lst if not x.startswith("t")] 
... 
>>> # Reassign 'lst' to the cleaned list 
>>> lst = func(lst) 
>>> lst 
['automatic', 'manual'] 
>>> 
6

你的函數返回None,但它打印出所有與他們"t"的話。你想要的是像

def f(p): 
    no_ts = [] 
    for el in p: 
     if not el.startswith("t"): 
      no_ts.append(el) 
    return no_ts 

它可以方便地與列表理解

[el for el in p if not el.lower().startswith("t")] 
# .lower() makes sure to catch words that start with "T" 

也做,這是最好的,如果你不跟喜歡「清單保留名稱命名變量混淆了命名空間「或」str「。

1

您可以使用過濾器:

>>> li=["titan","ton", "automatic","manual"] 
>>> filter(lambda s: not s.startswith('t'), li) 
['automatic', 'manual']