用于循环列表功能

时间:2013-11-04 22:23:59

标签: python python-2.7 python-3.x

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”开头的所有单词。然后该函数返回该列表。这个函数只返回一个包含所有单词的列表。

4 个答案:

答案 0 :(得分:6)

你的问题有两个:

  1. 您不是要删除功能列表中的项目。
  2. 你没有从函数中返回任何东西;即过滤后的清单。
  3. 但是,你不需要一个对这项工作来说很重要的功能。只需使用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']
    >>>
    

答案 1 :(得分: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"

此外,最好不要通过使用保留名称(如“list”或“str”)命名变量来混淆命名空间。

答案 2 :(得分: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']

您只需将print来电替换为yield并进行其他更改,即可让您的代码正常工作。使用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

答案 3 :(得分:1)

您可以使用过滤器:

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