如何检查字符串是不是是字符串列表中项目的子字符串?
Posted
技术标签:
【中文标题】如何检查字符串是不是是字符串列表中项目的子字符串?【英文标题】:How to check if a string is a substring of items in a list of strings?如何检查字符串是否是字符串列表中项目的子字符串? 【发布时间】:2011-06-18 02:35:14 【问题描述】:我有一个清单:
my_list = ['abc-123', 'def-456', 'ghi-789', 'abc-456']
并且想要搜索包含字符串'abc'
的项目。我该怎么做?
if 'abc' in my_list:
将检查'abc'
是否存在于列表中,但它是'abc-123'
和'abc-456'
的一部分,'abc'
本身不存在。那么如何获取所有包含'abc'
的项目呢?
【问题讨论】:
检查相反(如果一个字符串包含多个字符串中的一个):***.com/a/6531704/2436175 如果条目的左边部分是唯一的,考虑从列表中构造一个字典:Find an entry in a list based on a partial string 另见 Raymond Hettinger 的 this answer(这应该是这个问题的答案)。 【参考方案1】:如果您只需要知道“abc”是否在其中一项中,这是最短的方法:
if 'abc' in str(my_list):
注意:这里假定“abc”是一个字母数字文本。如果 'abc' 可能只是一个特殊字符(即 []', ),请不要使用它。
【讨论】:
如果你有一个 ["abc1", "1abc2"] 列表,这将失败,因为它会找到匹配项,因为字符串 'abc' 将在新创建的字符串中 是的,这是预期的行为......如果任何项目包含'abc',则为true 我不知道为什么所有这些人在不需要的时候决定做那些复杂的 lambda 解决方案!干得好@RogerS 其实同一个问题几乎可以自己回答...我只是添加了 3 个字母。 这是一个很好的解决方案,但是如果你想找到包含给定字符串的项目,你将不会成功。在这里您可以了解 any 项是否包含该字符串。【参考方案2】:我是 Python 新手。我得到了下面的代码并使其易于理解:
my_list = ['abc-123', 'def-456', 'ghi-789', 'abc-456']
for item in my_list:
if 'abc' in item:
print(item)
【讨论】:
【参考方案3】:将 nan 添加到列表中,以下对我有用:
some_list = ['abc-123', 'def-456', 'ghi-789', 'abc-456',np.nan]
any([i for i in [x for x in some_list if str(x) != 'nan'] if "abc" in i])
【讨论】:
【参考方案4】:如果要获取多个子字符串的数据列表
你可以这样改
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']
【讨论】:
【参考方案5】:我需要与匹配项对应的列表索引,如下所示:
lst=['abc-123', 'def-456', 'ghi-789', 'abc-456']
[n for n, x in enumerate(lst) if 'abc' in x]
输出
[0, 3]
【讨论】:
【参考方案6】:只是把它扔在那里:如果您碰巧需要匹配多个字符串,例如abc
和def
,您可以组合两种理解,如下所示:
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']
【讨论】:
这正是我在谷歌上搜索的内容。谢谢! 你也可以使用s for s in my_list for xs in matchers if xs in s
(注意花括号来创建一个独特的集合)。可能更容易阅读,但如果大多数 s
值都匹配,则可能会更慢,因为您的 any
将在第一个匹配时有效地停止。【参考方案7】:
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?")
【讨论】:
【参考方案8】:使用Pythons字符串类的__contains__()
方法:
a = ['abc-123', 'def-456', 'ghi-789', 'abc-456']
for i in a:
if i.__contains__("abc") :
print(i, " is containing")
【讨论】:
【参考方案9】:我做了一个搜索,需要你输入一个特定的值,然后它会从包含你输入的列表中寻找一个值:
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”。
【讨论】:
【参考方案10】:mylist=['abc','def','ghi','abc']
pattern=re.compile(r'abc')
pattern.findall(mylist)
【讨论】:
在 Python3.6 中会报错:TypeError: expected string or bytes-like object @AimForClarity 是的。 python3.6 中的 re.findall 需要一个字符串。另一种方法是将列表转换为字符串import re
mylist=['abc','def','ghi','abcff']
my_list_string=''.join(mylist)
string_to_find="abc"
res=re.findall(string_to_find,my_list_string)
print(res)
很抱歉格式不好。由于某种原因无法正确换行。【参考方案11】:
问题:给出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']
【讨论】:
【参考方案12】:my_list = ['abc-123', 'def-456', 'ghi-789', 'abc-456']
for item in my_list:
if (item.find('abc')) != -1:
print ('Found at ', item)
【讨论】:
【参考方案13】:如果您只想检查列表中任何字符串中是否存在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]
【讨论】:
@OlivierPons,就做if myitem in myarray:
另一种获取所有包含子字符串'abc'的字符串的方法:filter(lambda element: 'abc' in element, some_list)
@p014k:使用index()
方法:try: return mylist.index(myitem); except ValueError: pass
@midkin:我既不明白你到底想做什么,也不明白它是怎么出错的。通过提出一个新问题(使用“”按钮)、复制您的确切代码、您希望代码做什么以及它实际做了什么,您可能会获得更多的运气。 “没有工作”是完全没有意义的,除非你在这种情况下定义“工作”是什么意思,但即便如此,最好解释实际发生的事情,而不是说没有发生的事情。
@LarryCai 检查"abc" in some_string
将检查"abc"
是否存在作为some_string
的精确连续子字符串,因此"abc" in "cba-4123"
和"abc" in "a-b-c"
都将返回False
。无需修改代码。【参考方案14】:
使用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
类型。
【讨论】:
【参考方案15】:for item in my_list:
if item.find("abc") != -1:
print item
【讨论】:
如果你打算采用这种方法,我认为使用if 'abc' in item
而不是使用item.find('abc') == -1
会更惯用。【参考方案16】:
x = 'aaa'
L = ['aaa-12', 'bbbaaa', 'cccaa']
res = [y for y in L if x in y]
【讨论】:
【参考方案17】:这是一个相当老的问题,但我提供这个答案是因为以前的答案不能处理列表中不是字符串(或某种可迭代对象)的项目。这样的项目会导致整个列表理解失败并出现异常。
要通过跳过不可迭代的项目来优雅地处理列表中的此类项目,请使用以下内容:
[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']
)
iterable 的测试可能不是最好的。从这里得到它:In Python, how do I determine if an object is iterable?
【讨论】:
[el for el in lst if el and (st in el)]
在给定的示例中不会更有意义吗?
@tinix 我不会优雅地处理不可迭代的对象,对吗?
“给定的例子”my_list = ['abc-123', 'def-456', 'ghi-789', 'abc-456']
无需过于复杂。
是的,绝对是 - 接受的答案非常合适,我的建议更复杂,所以请随意忽略它 - 我只是提供以防有人遇到与我相同的问题:不可迭代的项目尽管在给定的示例中不存在此类列表,但在现实世界中是可能的。【参考方案18】:
any('abc' in item for item in mylist)
【讨论】:
以上是关于如何检查字符串是不是是字符串列表中项目的子字符串?的主要内容,如果未能解决你的问题,请参考以下文章
Python如何检查列表中的项目是不是为浮点数,如果是,将其更改为字符串? [复制]
如何检查字符串是不是在列表中,使用每个项目上的函数(python3)[重复]