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

时间:2011-01-30 13:29:48

标签: python

我有一个清单:

my_list = ['abc-123', 'def-456', 'ghi-789', 'abc-456']

并想要搜索包含字符串'abc'的项目。我怎么能这样做?

if 'abc' in my_list:

会检查列表中是否存在'abc',但它是'abc-123''abc-456'的一部分,'abc'本身不存在。那么如何获取包含'abc'的所有项目?

19 个答案:

答案 0 :(得分:761)

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

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

如果您确实想要获取包含abc的所有项目,请使用

matching = [s for s in some_list if "abc" in s]

答案 1 :(得分:73)

使用filter获取包含abc

的元素
>>> lst = ['abc-123', 'def-456', 'ghi-789', 'abc-456']
>>> print filter(lambda x: 'abc' in x, lst)
['abc-123', 'abc-456']

您还可以使用列表推导。

>>> [x for x in lst if 'abc' in x]

顺便说一句,请勿使用list一词作为变量名称,因为它已用于list类型。

答案 2 :(得分:68)

只是抛弃它:如果您碰巧需要匹配多个字符串,例如abcdef,您可以将两个列表推导组合如下:

matchers = ['abc','def']
matching = [s for s in my_list if any(xs in s for xs in matchers)]

输出:

['abc-123', 'def-456', 'abc-456']

答案 3 :(得分:36)

这是最短的方式:

*T

答案 4 :(得分:18)

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

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

[el for el in lst if isinstance(el, collections.Iterable) and (st in el)]

然后,用这样的清单:

lst = [None, 'abc-123', 'def-456', 'ghi-789', 'abc-456', 123]
st = 'abc'

您仍会获得匹配的项目(['abc-123', 'abc-456']

可迭代的测试可能不是最好的。从这里得到它:In Python, how do I determine if an object is iterable?

答案 5 :(得分:11)

for item in my_list:
    if item.find("abc") != -1:
        print item

答案 6 :(得分:10)

x = 'aaa'
L = ['aaa-12', 'bbbaaa', 'cccaa']
res = [y for y in L if x in y]

答案 7 :(得分:5)

any('abc' in item for item in mylist)

答案 8 :(得分:1)

如果要获取多个子字符串的数据列表

您可以通过这种方式更改

some_list = ['abc-123', 'def-456', 'ghi-789', 'abc-456']
# select element where "abc" or "ghi" is included
find_1 = "abc"
find_2 = "ghi"
result = [element for element in some_list if find_1 in element or find_2 in element] 
# Output ['abc-123', 'ghi-789', 'abc-456']

答案 9 :(得分:1)

我是python的新手。下面的代码工作且易于理解

my_list = ['abc-123', 'def-456', 'ghi-789', 'abc-456']
    for str in my_list:
        if 'abc' in str:
            print(str)

答案 10 :(得分:1)

使用__contains__()字符串方法。

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

答案 11 :(得分:0)

将 nan 添加到列表中,以下对我有用:

{
    "status": 0,
    "message": "ok",
    "data": {
        "msisdn": "081327255200"
    }
}

答案 12 :(得分:0)

我需要与匹配项相对应的列表索引

lst=['abc-123', 'def-456', 'ghi-789', 'abc-456']

[n for n, x in enumerate(lst) if 'abc' in x]

输出

[0, 3]

答案 13 :(得分:0)

def find_dog(new_ls):
    splt = new_ls.split()
    if 'dog' in splt:
        print("True")
    else:
        print('False')


find_dog("Is there a dog here?")

答案 14 :(得分:0)

我进行了搜索,要求您输入一个特定值,然后它将从包含您输入内容的列表中寻找一个值:

my_list = ['abc-123',
        'def-456',
        'ghi-789',
        'abc-456'
        ]

imp = raw_input('Search item: ')

for items in my_list:
    val = items
    if any(imp in val for items in my_list):
        print(items)

尝试搜索“ abc”。

答案 15 :(得分:0)

mylist=['abc','def','ghi','abc']

pattern=re.compile(r'abc') 

pattern.findall(mylist)

答案 16 :(得分:0)

my_list = ['abc-123', 'def-456', 'ghi-789', 'abc-456']

for item in my_list:
    if (item.find('abc')) != -1:
        print ('Found at ', item)

答案 17 :(得分:-1)

问题:提供abc的信息

    a = ['abc-123', 'def-456', 'ghi-789', 'abc-456']


    aa = [ string for string in a if  "abc" in string]
    print(aa)

Output =>  ['abc-123', 'abc-456']

答案 18 :(得分:-1)

据我所知,'for'语句总会消耗时间。

当列表长度增长时,执行时间也会增加。

我认为,使用'is'语句搜索字符串中的子字符串会更快一些。

In [1]: t = ["abc_%s" % number for number in range(10000)]

In [2]: %timeit any("9999" in string for string in t)
1000 loops, best of 3: 420 µs per loop

In [3]: %timeit "9999" in ",".join(t)
10000 loops, best of 3: 103 µs per loop

但是,我同意any语句更具可读性。

相关问题