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循環列表函數
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循環列表函數
根本沒有返回列表,只是打印它的項目。
其次,不需要使用索引來遍歷列表項,只需遍歷列表本身即可。使用
解決一個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
你的問題是雙重的:
但是,您不需要爲這項工作很大的功能。只需使用一個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']
>>>
你的函數返回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「。
您可以使用過濾器:
>>> li=["titan","ton", "automatic","manual"]
>>> filter(lambda s: not s.startswith('t'), li)
['automatic', 'manual']
它不返回任何東西。 – kindall
不要使用'list'作爲變量名! – dawg