0

我有一个对象列表,其中一些以“A”开头,而另一些则不是。

使用列表推导或 lambda 函数(最好),我想遍历每一个,如果元素不是以“A”开头,则添加它(或返回一个编辑列表)。

我已经尝试了一些东西,比如这个(其中 y 是列表):

filter(lambda x: x if x[0] == 'A' else "A" + x, y)

但它返回相同的列表,y。

任何帮助表示赞赏;谢谢!

编辑:例如,如果我从列表 ['Alligator', 'pple', 'banana'] 开始,该行将返回列表 ['Alligator', 'Apple', 'Abanana']

4

5 回答 5

4

您要映射,而不是过滤:

map(lambda x: x if x[0] == 'A' else "A" + x, y)

或者,使用列表推导:

[x if x[0] == 'A' else "A" + x for x in y]

过滤类似于if列表推导式末尾的语句,映射类似于开头的表达式。

演示:

>>> y = ['Alligator', 'pple', 'banana']
>>> map(lambda x: x if x[0] == 'A' else "A" + x, y)
['Alligator', 'Apple', 'Abanana']
>>> [x if x[0] == 'A' else "A" + x for x in y]
['Alligator', 'Apple', 'Abanana']
于 2013-08-04T14:34:23.893 回答
2

尝试使用此列表理解:

[x if x.startswith('A') else 'A' + x for x in lst]

例如:

y = ['Alligator', 'pple', 'banana']
[x if x.startswith('A') else 'A' + x for x in y]
=> ['Alligator', 'Apple', 'Abanana']

请注意, usingx.startswith('A')比询问 if 更惯用和更清晰x[0] == 'A'

于 2013-08-04T14:34:49.297 回答
0

如果您需要查找以“A”开头的项目,您可以使用列表推导或filter

>>> l = ["Aaaa", "test", "A1", "1"]
>>> [item for item in l if item.startswith('A')]
['Aaaa', 'A1']
>>> l = ["Aaaa", "test", "A1", "1"]
>>> filter(lambda item: item.startswith('A'), l)
['Aaaa', 'A1']

如果您想将“A”添加到列表中不以“A”开头的项目,您可以使用列表推导或map

>>> l = ["Aaaa", "test", "A1", "1"]
>>> ['A' + item if not item.startswith('A') else item for item in l]
['Aaaa', 'Atest', 'A1', 'A1']
>>> map(lambda item: 'A' + item if not item.startswith('A') else item, l)
['Aaaa', 'Atest', 'A1', 'A1']

仅供参考,在这两种情况下你都会得到一个新的列表。如果要就地修改列表,可以尝试以下代码:

>>> l = ["Aaaa", "test", "A1", "1"]
>>> for i in range(len(l)):
...     if not l[i].startswith('A'):
...         l[i] = 'A' + l[i]
... 
>>> l
['Aaaa', 'Atest', 'A1', 'A1']
于 2013-08-04T14:34:18.110 回答
0

列表理解

>>> y = ['A1', 'B1', 'A2', 'B2']
>>> [i if i[0] == 'A' else 'A%s'%i for i in y]
['A1', 'AB1', 'A2', 'AB2']

你的例子:

>>> y = ['Alligator', 'pple', 'banana']
>>> [i if i[0] == 'A' else 'A%s'%i for i in y]
['Alligator', 'Apple', 'Abanana']
于 2013-08-04T14:36:28.650 回答
0

好吧,如果你真的想让你的filter方向起作用,你可以这样做:

>>> example=['Alligator', 'pple', 'banana']
>>> for i,e in filter(lambda t: t[1][0]!='A',enumerate(example)):     
...     example[i]='A'+e
>>> example
['Alligator', 'Apple', 'Abanana']

您过滤以返回要更改的项目,并为要更改enumerate的项目提供索引作为元组:

>>> filter(lambda t: t[1][0]!='A',enumerate(example))
[(1, 'pple'), (2, 'banana')]
>>> filter(lambda t: t[1][0]=='A',enumerate(example))
[(0, 'Alligator')]
于 2013-08-04T15:30:28.663 回答