Filtering a list of strings based on contents
考虑到EDOCX1[0]列表,我想计算一个包含EDOCX1[1]的字符串的列表。即结果为['ab','abc']。如何在python中实现这一点?
- 谢谢,伊莱·本德斯基
- 给定列表['a'、'b'、'c'、'a'、'b'],我想计算一个包含字符串"a"和"b"的列表。也就是说,结果是[‘A’,‘B’]。如何在python中实现这一点?
这种简单的过滤可以通过多种方式通过python实现。最好的方法是使用"列表理解",如下所示:
1 2 3 4 5
| >>> lst = ['a', 'ab', 'abc', 'bac']
>>> res = [k for k in lst if 'ab' in k]
>>> res
['ab', 'abc']
>>> |
另一种方法是使用filter功能:
1 2 3
| >>> filter(lambda k: 'ab' in k, lst)
['ab', 'abc']
>>> |
- 为什么?在适当的环境中学习有用的高级编程主题有什么问题?
- @EdiBendersky:因为它们比有用更令人困惑?因为它会导致"使用def"回答的问题?因为它很少能带来比编码高尔夫更好的东西?我不知道,在用各种语言编程30年后,它们对我来说似乎是无用的。但我想他们对你很重要。
- @洛特:我认为lambda正在促进将函数作为一级对象的考虑,这对于一些编程范例很重要。我不会说它们对我很重要,但我相信即使是新手也能从这样的编程中受益,而且绝对不会称之为"强加"。
- @我猜它们很重要,因为你没有很多理由使用它们。考虑到对lambda的问题比对def的问题更多,我猜想lambda确实令人困惑,难以理解。我不确定lambda有多大帮助,因为它是filter函数迫使人们考虑函数编程。使用filter的任何示例(如本例)都是显示函数编程的好东西。省略lambda——imo——使它成为展示函数式编程能力的更好方法。
- @S.lott:但在这种情况下,lambda不是filter的完美伴侣吗?我认为,编写一个单独的函数来检查ab是否在给定的列表中是一种过度杀伤力。编写一个更通用的函数,它基本上包装了in操作符。在没有lambda的情况下,您如何更清楚地使用filter?
- @不,我发现lambda并不是任何事物的完美伴侣。我会使用def,我会发现它不那么令人困惑;我可能需要回答一个关于lambda的问题。答案看起来不像是"代码高尔夫"。如我所说,江户十一〔二〕号很好。我发现一个简单的def不会损害n00b学习filter如何工作的重要性。
- 找到这个答案的不仅是N00B
- 我是一个N00B,现在我被介绍到lambda。知道这一点感觉很棒。现在我将进一步了解它。
- 我必须用list()函数将过滤器包围起来,才能取回一个列表,否则我会得到一个过滤器对象。不知道这是不是因为Python版本(我使用3.5)
- 我了解了lambda和一个新的表达式"code golf"^ ^很好,所以这里有个问题
1
| [x for x in L if 'ab' in x] |
1 2 3 4 5 6
| # To support matches from the beginning, not any matches:
items = ['a', 'ab', 'abc', 'bac']
prefix = 'ab'
filter(lambda x: x.startswith(prefix), items) |
- 避免将列表作为变量名,因为这是一个python对象类型。
在交互式shell中快速尝试了此方法:
1 2 3 4
| >>> l = ['a', 'ab', 'abc', 'bac']
>>> [x for x in l if 'ab' in x]
['ab', 'abc']
>>> |
为什么会这样?因为in运算符是为表示"is substring of"的字符串定义的。
此外,您可能会考虑编写循环,而不是使用上面使用的列表理解语法:
1 2 3 4 5
| l = ['a', 'ab', 'abc', 'bac']
result = []
for s in l:
if 'ab' in s:
result.append(s) |
1 2
| mylist = ['a', 'ab', 'abc']
assert 'ab' in mylist |