检查对象是否为列表的pythonic方法是什么?

10 python list

我有一个函数,可以包含一个数字或一个数字列表.什么是最pythonic方式检查它是什么?到目前为止,我已经提出了try/except块检查,如果我可以切片零项,即.OBJ [0:0]

编辑:

由于没有提供足够的信息,我似乎已经在下面开始了一场口水战.为了完整性,让我提供更多细节,以便我可以挑选并获得最佳答案:

我在Python 2.6上运行Django,我正在编写一个可以接受Django模型实例或查询集对象并对其执行操作的函数,其中一个函数涉及使用需要列表的过滤器'in'(查询集输入) ),或者如果它不是列表,那么我会使用'get'过滤器(django get过滤器).

Ale*_*lli 21

在这种情况下,您通常需要检查任何可迭代的,而不仅仅是列表 - 如果您接受列表或数字,拒绝(例如)元组将是奇怪的.您可能想要将其视为"标量"的一种可迭代是一个字符串 - 在Python 2.*中,这意味着strunicode.那么,要么:

def isNonStringIterable(x):
  if isinstance(x, basestring):
    return False
  try: iter(x)
  except: return False
  else: return True
Run Code Online (Sandbox Code Playgroud)

或者,通常更方便:

def makeNonStringIterable(x):
  if isinstance(x, basestring):
    return (x,)
  try: return iter(x)
  except: return (x,)
Run Code Online (Sandbox Code Playgroud)

你去哪里 for i in makeNonStringIterable(x): ...

  • @gs,鉴于我已经成为一名Python提交者8年了(并且已经在Python上写过热门书籍等等),我很想教你如何使用我所有这些中的"错误工具"通过不使用`collections.Sequence`(这将排除`set`没有任何好的理由),肯定不是(考虑你广泛不喜欢的答案),例如 - RIGHT? - ) (14认同)
  • @gs,没有,除了`try:iter(x)/ except`是_cross-platform_ - Python生产使用仍然经常被限制为2.4(现在很少见但不是闻所未闻)或2.5(App Engine,&c), collections.Iterable仅为2.6,try/except方法在2.2及更高版本中的工作方式完美! - ) (3认同)
  • 他要求"检查对象是否是列表".也许他真的想检查它是否是可迭代的,但在我看来,在他知道得出什么结论之后,关于他实际做了什么的信息太少(零).(如果他提供的用例代码显示他正在做的所有事情,如果它是一个列表正在迭代,那么我同意你的看法.)我认为,在此之前我们不同意这一点.我怀疑当我们选择松散地解释问题时,我们只会有所不同.*耸肩* (3认同)
  • @Alex:你是对的.我没想到套装.如果你被冒犯,我很抱歉.看起来你有最好的解决方案.(取决于问题的作者真正在寻找什么.) (2认同)

Vin*_*nce 13

if isinstance(your_object, list):
  print("your object is a list!")
Run Code Online (Sandbox Code Playgroud)

这比使用类型检查更像Pythonic.

似乎也更快:

>>> timeit('isinstance(x, list)', 'x = [1, 2, 3, 4]')
0.40161490440368652
>>> timeit('type(x) is list', 'x = [1, 2, 3, 4]')
0.46065497398376465
>>> 
Run Code Online (Sandbox Code Playgroud)

  • 此解决方案可防止任何不是列表子类的自定义列表. (4认同)

Geo*_*lly 11

你没有.

这仅适用于Python> = 2.6.如果您的目标是以下任何内容,请使用Alex的解决方案.

Python支持名为Duck Typing的东西.您可以使用ABC类查找某些功能.

import collections
def mymethod(myvar):
    # collections.Sqeuence to check for list capabilities
    # collections.Iterable to check for iterator capabilities
    if not isinstance(myvar, collections.Iterable):
        raise TypeError()
Run Code Online (Sandbox Code Playgroud)