【问题标题】:How to check if the substring exists in a list of values in Python?如何检查子字符串是否存在于 Python 的值列表中?
【发布时间】:2019-09-09 21:07:40
【问题描述】:

我有一个不同类型的值列表,我想检查给定列表中是否存在子字符串,当找到时,我想取回它的索引。

我尝试使用 any() 进行此操作,但提示 in <string>' requires string as left operand, not int 时出现错误。我假设,列表中的所有值都必须是字符串才能使用any()。 我还能用什么其他方法来实现这一点?

这是我当前的代码:

list_val = [1,18.0, 'printer', 'EXTRACT (123)']
string_val = 'EXTRACT'
any(x in string_val for x in list_val)

我什至尝试将所有非字符串转换为字符串,然后想使用上述any() 逻辑,但这给了我其他错误。我尝试了以下方法:

for i, val in enumerate(list_val):
    if not isinstance(val, str):
        list_val[i] = str(val)

这会引发错误:isinstance() arg 2 must be a type or tuple of types

【问题讨论】:

  • 你会使用string_val in x,开始。
  • 根据您的错误消息,我认为您覆盖了 str 类型。尝试print(str) 进行检查。如果输出不是 <type 'str'>,那就有问题了。
  • 您的第二个异常表明您已通过将其他内容绑定到名称 str 来掩盖内置类型。使用del str 摆脱它。

标签: python


【解决方案1】:

只需根据字符串过滤您的列表,并仅针对通过过滤器的列表进行测试:

any(string_val in item for item in list_val if isinstance(item, str))

演示:

>>> list_val = [1,18.0, 'printer', 'EXTRACT (123)']
>>> string_val = 'EXTRACT'
>>> any(string_val in item for item in list_val if isinstance(item, str))
True

请注意,我使用的是string_val in item,而不是item in string_val;您的示例列表清楚地表明您想查看是否有任何元素包含EXTRACT,而不是是否有元素是EXTRACT 的子字符串(例如'EXT''RACT' 等)。

您的第二次尝试失败只是因为您似乎为名称 str 分配了其他内容,因为 isinstance() 调用在其他方面是正确的:

>>> isinstance("foo", str)
True
>>> str = "spam"
>>> isinstance("foo", str)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: isinstance() arg 2 must be a type or tuple of types
>>> del str
>>> isinstance("foo", str)
True

通过再次删除 str 绑定可以轻松解决问题,就像我在上面所做的那样无论如何你都必须这样做,因为使用带有 isinstance() 过滤器的 any() 会看到相同的异常。

不过,您根本不需要更改 list_val 以使 any() 工作。

【讨论】:

  • 你的回答仍然给我以下TypeError Traceback (most recent call last) &lt;ipython-input-42-752296da52ed&gt; in &lt;module&gt; ----&gt; 1 any(string_val in item for item in list_val if isinstance(item, str)) &lt;ipython-input-42-752296da52ed&gt; in &lt;genexpr&gt;(.0) ----&gt; 1 any(string_val in item for item in list_val if isinstance(item, str)) TypeError: isinstance() arg 2 must be a type or tuple of types
  • @Tums:是的,因为你还有反弹str。删除它。 str 不是解析为内置类型,而是解析为 else
  • 你是绝对正确的。我正在使用 Jupyter,我删除了该单元格,但我没有意识到它仍在命名空间中。
  • 我怎样才能调整上面的代码以使其与字符串值列表一起工作:string_val = ['EXTRACT', 'SUBTRACT', 'DEDUCT', 'ADDIT', 'CLEAR']。那就是我想检查给定的list_val 中是否存在任何这些字符串。我将不胜感激。谢谢。
  • @Tums 要么在内部嵌套另一个 any() 循环 (any(v in item for v in string_val) for item in list_val)),要么使用正则表达式 (any(re.search(r’(EXTRACT|SUBTRACT|DEDUCT|ADDIT|CLEAR)', item) for item in list_val)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-16
  • 2015-12-24
  • 1970-01-01
  • 2017-02-28
相关资源
最近更新 更多