Python:通过字符串列表递归 - 如何区分?

时间:2011-09-21 12:13:46

标签: python string list types enumerable

我有以下代码

def printmylist( mylist ):
    """
    print tree
    """
    try:
    for f in mylist:
        printmylist( f )
    except:
        print( "        " + mylist )

希望获得如下输出:

root
   branch
     leaf
     leaf

但由于字符串是可枚举的,我得到

r
o
o
t
.
.

检查类型似乎是unpythonic,那么Python将如何解决这个问题呢?

3 个答案:

答案 0 :(得分:5)

我所知道的最简洁的方法是使用types.StringTypes(不要与types.StringType混淆):

isinstance(var, types.StringTypes)

可替换地:

isinstance(var, basestring)

types模块的文档表明后者是最近版本的Python 2.x中的首选方式。

答案 1 :(得分:1)

我使用以下pythonic方法来解决这个问题。无需isinstance()次来电。因此它甚至适用于我用python包装的各种自定义C ++字符串类。我不认为那些基于实例()的方法在这些情况下会起作用。此外,OP明确要求提供涉及类型检查的解决方案。 Pythonistas检查行为,而不是类型。

这里的技巧涉及观察字符串具有不寻常的属性:单字符字符串的第一个元素是相同的单字符字符串。

"f"[0] == "f"

这适用于python 2.x:

def is_string(s):
    try:
        if (s[0] == s[0][0]):
            return True
    except:
        pass
    return False

答案 2 :(得分:-1)

最简单的是if type(f) == str

有时最好使用if而不是例外。

编辑: 由于larsmans评论,我不推荐这个选项。它在简单使用中很有用,但在专业编码中,最好使用isinstance