关于python:if语句关于是一个字符串还是字符串列表

If statement on whether one string, or list of strings

本问题已经有最佳答案,请猛点这里访问。

我有以下功能。理想情况下,我希望将单个字符串或字符串列表作为输入传递。不管是哪种情况,我都要用。上面。但是,当只传递一个字符串时,迭代器将遍历每个字符。如何使用if语句来测试字符串列表还是单个字符串?(我似乎无法避免弦的无可辩驳的性质)

1
2
3
4
def runthis(stringinput):

    for t in stringinput:
        t = t.upper()


使用isinstance检查类型。

1
2
3
4
5
6
7
8
9
10
def runthis(stringinput):
    if isinstance(stringinput, list):
        for t in stringinput:
            t = t.upper()
            # Some other code should probably be here.
    elif isinstance(stringinput, basestring):
        t = t.upper()
        # Some other code perhaps as well.
    else:
        raise Exception("Unknown type.")

对于python 3,使用str而不是basestring


一种方法是显式检查参数是列表还是字符串,并在条件子句中对其进行不同的处理。

我认为更好的选择(如果它适合您的用例)可能是:

1
2
3
4
5
6
7
8
9
def runthis(*stringinput):
    for t in stringinput:
        t = t.upper()
        print(t)
    print()

runthis("test") # TEST
runthis("another","test")  # ANOTHER TEST
runthis(*["one","final","test"]) # ONE FINAL TEST

但是,如果调用代码可能提供列表而不显示列表,则此方法不适用。

这种方法依赖于*操作符的使用,这里有两种不同的使用方式。

在函数定义上下文(*stringinput中,此运算符实质上使stringinput成为可变参数;也就是说,将传递给函数的所有参数"收集"到一个元组中的参数,就runthis而言,该参数的作用类似于一个列表(可以重复)。如果我打电话给runthis("foo","bar","baz")stringinput的值将是("foo","bar","baz")

您可以在这里阅读更多关于变量参数的信息。

在函数调用上下文(runthis(*["one","final","test"])中,此运算符将"splat"或解包列表中的每个元素。本质上,runthis(*["one","final","test"])相当于runthis("one","final","test")

你可以在这里阅读更多关于喷溅的内容。


您可以使用isinstance()检查您的函数arg是否为list类型:

1
2
3
4
5
def to_upper(arg):
    if isinstance(arg, list):
        return [item.upper() for item in arg]  # This is called list comprehension
    else:
        return arg.upper()

您可以使用type()功能,如下所示:

1
2
3
4
5
6
if type(stringinput) is list:
    #Your list code
elif type(stringinput) is str:
    #Your string code
else:
    #stringinput isn't a list or a string, throw an error