python xticks用法 测试一个变量是一个列表还是元组




python描点 (9)

在Python中,测试变量是否包含列表或元组的最佳方法是什么? (即集合)

Isinstance是否像这里所建议的那样邪恶? http://www.canonical.org/~kragen/isinstance/

更新:我想区分列表与字符串的最常见的原因是当我有一个无限深的嵌套树/数据结构的列表的列表的列表的字符串等,我正在探索与递归算法,我需要知道我何时击中了“叶子”节点。


如何: hasattr(a, "__iter__")

它告诉返回的对象是否可以作为生成器迭代。 默认情况下,元组和列表可以,但不能是字符串类型。


原则上,我同意上面的Ignacio,但您也可以使用type来检查某些元素是否是元组或列表。

>>> a = (1,)
>>> type(a)
(type 'tuple')
>>> a = [1]
>>> type(a)
(type 'list')

使用isinstance没有任何问题,只要它不是多余的。 如果一个变量只应该是一个列表/元组,然后记录接口,并使用它。 否则,支票是完全合理的:

if isinstance(a, collections.Iterable):
    # use as a container
else:
    # not a container!

这种类型的检查确实有一些很好的用例,比如标准字符串startswith / endswith方法(尽管这些都是在CPython的C中使用显式检查来实现的,以查看它是否是元组),但有多种方式解决这个问题,正如您链接到的文章中提到的那样)。

显式检查通常比尝试将对象用作容器并处理异常要好 - 这可能会导致代码部分或不必要地运行时出现各种问题。


如果您只需要知道是否可以将foo[123]表示法与变量一起使用,则可以使用hasattr(foo, '__getitem__') )检查是否存在__getitem__属性(这是您通过索引访问时要调用的python) hasattr(foo, '__getitem__')


if type(x) is list:
    print 'a list'
elif type(x) is tuple:
    print 'a tuple'
else:
    print 'neither a tuple or a list'

在Python 2.8中, type(list) is list返回false
我会建议以这种可怕的方式比较类型:

if type(a) == type([]) :
  print "variable a is a list"

(至少在我的系统上,在Mac OS X Yosemite上使用anaconda)


将参数记录为需要成为序列,并将其用作序列。 不要检查类型。


如果你真的想把任何东西当作函数参数来处理,那么必须进行更复杂的测试。

type(a) != type('') and hasattr(a, "__iter__")

虽然通常只需要说明函数需要迭代,然后只检查type(a) != type('')就足够了。

也可能发生的情况是,对于一个字符串,你有一个简单的处理路径,或者你会很好,做一个拆分等,所以你不想大声嚷嚷字符串,如果有人给你一些奇怪的东西,让他有一个例外。


>>> l = []
>>> l.__class__.__name__ in ('list', 'tuple')
True






list