检查Python列表项是否包含另一个字符串中的字符串

San*_*yBr 518 python

我有一个清单:

my_list = ['abc-123', 'def-456', 'ghi-789', 'abc-456']
Run Code Online (Sandbox Code Playgroud)

并希望搜索包含该字符串的项目'abc'.我怎样才能做到这一点?

if 'abc' in my_list:
Run Code Online (Sandbox Code Playgroud)

会检查是否'abc'存在在列表中,但它的一部分'abc-123''abc-456','abc'对自己不存在.那么如何获得包含的所有项目'abc'

Sve*_*ach 832

如果您只想检查abc列表中是否存在任何字符串,您可以尝试

some_list = ['abc-123', 'def-456', 'ghi-789', 'abc-456']
if any("abc" in s for s in some_list):
    # whatever
Run Code Online (Sandbox Code Playgroud)

如果你真的想要获得包含的所有项目abc,请使用

matching = [s for s in some_list if "abc" in s]
Run Code Online (Sandbox Code Playgroud)

  • @OlivierPons,只是做`如果myitem在myarray中:` (34认同)
  • 获取包含子串'abc'的所有字符串的另一种方法:`filter(lambda element:'abc'in element,some_list)` (8认同)
  • @ p014k:使用`index()`方法:`try:return mylist.index(myitem); 除了ValueError:pass` (2认同)
  • @midkin:我既不明白你到底想做什么,也不明白它是如何出错的。通过提出新问题(使用“提问”按钮)、复制您的确切代码、您期望代码执行的操作以及它实际执行的操作,您可能会更幸运。“没有工作”是完全没有意义的,除非您在这种情况下定义“有效”的含义,但即便如此,最好解释实际发生的事情而不是说没有发生的事情。 (2认同)

fan*_*ous 82

就在这扔在那里:如果你碰巧需要来匹配多个字符串,例如abcdef,你可以把组合两个list解析如下:

matchers = ['abc','def']
matching = [s for s in my_list if any(xs in s for xs in matchers)]
Run Code Online (Sandbox Code Playgroud)

输出:

['abc-123', 'def-456', 'abc-456']
Run Code Online (Sandbox Code Playgroud)

  • 这正是我在谷歌搜索...谢谢! (3认同)
  • 令人惊叹 - 在类似的情况下我会使用 pandas str.contains,但对于列表来说这是完美的 (3认同)
  • 你也可以使用`{s for my inlist in xs in matchers if xs in s}`(注意大括号创建一个唯一的集合).可能更容易阅读,但如果大多数's`值匹配,可能会更慢,因为你的'any`将在第一场比赛时有效停止. (2认同)

MAK*_*MAK 79

使用filter以获取该具备的要素abc.

>>> lst = ['abc-123', 'def-456', 'ghi-789', 'abc-456']
>>> print filter(lambda x: 'abc' in x, lst)
['abc-123', 'abc-456']
Run Code Online (Sandbox Code Playgroud)

您还可以使用列表推导.

>>> [x for x in lst if 'abc' in x]
Run Code Online (Sandbox Code Playgroud)

顺便说一句,不要将该词list用作变量名,因为它已经用于该list类型.


Rog*_*erS 41

这是最短的方式:

if 'abc' in str(my_list):
Run Code Online (Sandbox Code Playgroud)

  • 我不知道为什么所有其他人决定在他们不需要的时候做那些错综复杂的lambda解决方案!干得好@RogerS (4认同)
  • 如果您有一个 ["abc1", "1abc2"] 列表,则会失败,因为它会找到匹配项,因为字符串“abc”将位于新创建的字符串中 (3认同)
  • 是的,这是预期的行为...如果任何一项包含“ abc”,则为true (2认同)
  • 这是一个很好的解决方案,但是如果您想找到包含给定字符串的_the items_,您将不会成功。在这里您可以找出_any_项目是否包含该字符串。 (2认同)

Rob*_*uil 18

这是一个相当古老的问题,但我提供了这个答案,因为之前的答案不能处理列表中不是字符串(或某种可迭代对象)的项目.这些项目会导致整个列表理解失败并出现异常.

要通过跳过不可迭代的项目来优雅地处理列表中的此类项目,请使用以下命令:

[el for el in lst if isinstance(el, collections.Iterable) and (st in el)]
Run Code Online (Sandbox Code Playgroud)

那么,有这样一个清单:

lst = [None, 'abc-123', 'def-456', 'ghi-789', 'abc-456', 123]
st = 'abc'
Run Code Online (Sandbox Code Playgroud)

你仍然会得到匹配的项目(['abc-123', 'abc-456'])

可迭代的测试可能不是最好的.从这里得到它:在Python中,我如何确定一个对象是否可迭代?


Mar*_*riy 11

x = 'aaa'
L = ['aaa-12', 'bbbaaa', 'cccaa']
res = [y for y in L if x in y]
Run Code Online (Sandbox Code Playgroud)


Rub*_*con 10

for item in my_list:
    if item.find("abc") != -1:
        print item
Run Code Online (Sandbox Code Playgroud)

  • 如果您要采用这种方法,我认为在项目中使用if如果是abc会比较惯用,而不是使用item.find('abc')== -1`。 (3认同)

Amo*_*kar 8

我是 Python 的新手。我让下面的代码工作并使其易于理解:

my_list = ['abc-123', 'def-456', 'ghi-789', 'abc-456']
for item in my_list:
    if 'abc' in item:
       print(item)
Run Code Online (Sandbox Code Playgroud)


Imr*_*ran 5

any('abc' in item for item in mylist)
Run Code Online (Sandbox Code Playgroud)


Har*_*dhi 5

使用__contains__()Pythons字符串类的方法:

a = ['abc-123', 'def-456', 'ghi-789', 'abc-456']
for i in a:
    if i.__contains__("abc") :
        print(i, " is containing")
Run Code Online (Sandbox Code Playgroud)