【问题标题】:Check a python list if any of its elements is string type检查 python 列表是否有任何元素是字符串类型
【发布时间】:2014-09-19 20:48:00
【问题描述】:

如果列表包含字符串数据类型的元素,当给出混合类型的列表时,我正在尝试引发TypeError。我可以使用下面的代码做到这一点,但我想知道是否有更好的方法来实现相同的结果。

numbers = [1, "two", 3, 4, 5]
myStrList = [x for x in numbers if isinstance(x, str)]
if len(myStrList) != 0:
    raise TypeError
else:
    #do something

【问题讨论】:

  • 请问您是什么意思还有其他方法可以进行检查。为什么要另辟蹊径?您面临的问题是什么?
  • 只是为了避免建立不必要的列表.....

标签: python exception typechecking


【解决方案1】:

您可以使用anygenerator expression

numbers = [1, "two", 3, 4, 5]
if any(isinstance(x, str) for x in numbers):
    raise TypeError
else:
    #do something

除了代码更少这一事实之外,此解决方案实际上比您当前的解决方案高效得多。这是因为,它不会构建不必要的列表,而是会懒惰地计算结果,并且只检查必要的项目。


另外,如果您使用的是 Python 2.x,那么最好测试 basestring 的实例,而不仅仅是 str。这将使您还可以捕获列表中的任何 unicode 字符串。

【讨论】:

  • 等一下,引发 TypeError 不仅仅是多余的吗?如果在任何时候列表上有一个字符串,那么每当您尝试对他进行操作时都会引发错误。
  • @Ben - 可能。但是,如果在列表中找到一个字符串,那么 OP 可能希望提前失败。据我们所知,#do something 可能是一项非常耗费人力的工作。看起来 OP 希望在继续之前确保列表是“干净的”。
  • 非常感谢!它的工作......我正在使用 Python 3.4
  • 那么它应该是int的否定类型,字符串和int不是python处理的唯一数据类型:)
  • 仅供参考,我正在尝试计算代码其他部分的平均偏差。以下是完整代码
【解决方案2】:

过滤列表中的字符串也可以:

L=[0, 0, 1, 2, 'a', 3, 0, 0, 'l']

if filter(lambda item: isinstance(item, str), L) != []:
  raise TypeError
else:
  #do something

如果过滤后的列表为空,则原始列表中没有字符串。

【讨论】:

    猜你喜欢
    • 2017-03-11
    • 1970-01-01
    • 1970-01-01
    • 2011-11-03
    • 2017-11-20
    • 2015-10-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多