【问题标题】:How to check whether a Python list contains ANY string as an element如何检查 Python 列表是否包含任何字符串作为元素
【发布时间】:2021-03-06 04:45:45
【问题描述】:

所以,我正在研究一个 Python 函数,它接收一个数字列表作为参数并对其进行处理,就像这个例子一样:

def has_string(myList: list) -> str:

    # Side cases
    if myList == []:
        return "Empty list can not be accepted as argument"

    if myList contains any str object:  # Here's the problem
        return "Message: list contains at least one 'str' object"

    return "Success, list contains only numeric values"

函数的用途:

  • 接受:
    1. 空列表 ([]);
    2. 非数字列表。
  • 返回字符串消息。

我尝试了一些方法,例如:

  1.  if str in my_list:  # return message
    
  2.  if "" in my_list:  # return message
    
  3.  if my_list.count(""):  # return message
    

然后尝试继续进行。我不想创建一个 for 循环并逐项检查,因为我想要一个不同的解决方案,它不需要通过所有索引来判断我的列表是否包含字符串。

正如我之前提到的,我在 if 块中尝试了一些不同的方法来检查它,但都没有奏效;即使有一个错误标准来停止它,程序仍然继续处理该列表。

非常感谢任何帮助,在此先感谢!

【问题讨论】:

  • 没有某种循环是不可能的。您当然可以使循环非常简洁,但是如果不实际访问每个元素,就不可能测试每个元素的“类型”。一个这样的“干净”示例可能是any(isinstance(i, str) for i in my_list)
  • 感谢您的回答!对我来说很有价值!那么,我可以在 if 块中使用它吗?即使它写在 if 块中,它会遍历列表吗?
  • any 将返回TrueFalse,所以可以在if 语句中使用它。 (isinstance(i, str) for i in my_list) 被称为生成器表达式,它将遍历 my_list。正如我之前所说,如果不以某种方式遍历它们,就无法检查列表的所有元素。通过使用any,一旦找到单个str,循环就会退出,因此在此之后不再继续,可以节省一点时间,但如果没有,它必须检查列表中的每个成员如果最后一个是字符串。
  • 我还应该指出,使用列表调用in 实际上是在运行for 循环来检查列表的每个元素以确定给定对象是否在列表中。对于此实例,无法避免 for 循环(无论该循环是您编写的循环,还是发生在幕后的循环)。
  • 非常有趣的解释,谢谢!

标签: python string list any


【解决方案1】:

all() 停在第一个项目评估为 False。基本上:

if all(isinstance(x, (int, float)) for x in my_list):
    print("all numbers!")
else:
    print("not all number!")

并且使用这些 C 级函数而不是推导式应该更高效:

from itertools import repeat
if all(map(isinstance, my_list, repeat((int, float)))):
    print("all numbers!")
else:
    print("not all number!")

【讨论】:

  • 非常聪明的方法,all( ) 的用法很有趣。感谢您的贡献!
【解决方案2】:

除了使用for 循环显式地检查序列,还是使用更高级别的构造隐式地检查序列外,我想不出任何其他方法来检查序列。鉴于此,如果您的意图是在列表中找到一个非数字值时“结束程序”,那么您可能会考虑这样的事情。

例子:

my_list = [1,2,3,4,6,7,"8"]

for value in my_list:
    if not isinstance(value, (int, float)):
        raise TypeError(f"Expected only numeric types, found {type(value)} in sequence.")

输出:

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-7-791ea7c7a43e> in <module>
      3 for value in my_list:
      4     if not isinstance(value, (int, float)):
----> 5         raise TypeError(f"Expected only numeric types, found {type(value)} in sequence.")

TypeError: Expected only numeric types, found <class 'str'> in sequence.

【讨论】:

    【解决方案3】:

    由于您不想 for 循环使用 map 并获取列表中每个元素的类型,因此您可以使用 in 检查列表是否包含字符串:

    seq = [0, 1, 2, 3, 4, "Hello"]
    
    if str in map(type, seq):
        print("List contains string")
    
    else:
        print("Accepted")
    

    【讨论】:

      【解决方案4】:
      seq = [0, 1, 2, 3, "5", 8, 13] 
      
      result = filter(lambda x: type(x)==str, seq)
       
      print(list(result))
      

      可能此代码将过滤列表中的所有 str 类型值

      【讨论】:

      • 通常建议使用isinstance 而不是type(item) == some_type,因为它可以正确处理派生类的继承。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-11-20
      • 2021-10-31
      • 2012-08-31
      • 2011-12-23
      • 2019-03-16
      • 2010-10-04
      • 2014-09-19
      相关资源
      最近更新 更多