我创建了一个需要列表才能正常工作的方法。但是,您可以发送一个列表或一个简单的字符串。我想将该字符串转换为包含整个字符串作为元素的列表。例如,如果我有:
"I am a string"
我想将其转换为:
["I am a string"]
我能够这样做:
"I am a string".split("!@#$%^&*")
因为我永远不会有这种符号组合,所以它总会将它转换为列表而不删除任何字符。但是,这似乎不是一种很好的方法。还有另一种方式吗?
答案 0 :(得分:8)
>>> "abc"
'abc'
>>> ["abc"]
['abc']
>>> abc = "abc"
>>> abc
'abc'
>>> [abc]
['abc']
>>> "I am a string".split("!@#$%^&*") == ["I am a string"]
True
将值放在方括号中会生成包含一个项目的列表,就像多个值生成包含多个项目的列表一样。唯一不遵循此模式的容器是元组,因为圆括号也用于分组。在这种情况下,只需在单个项目后添加逗号:
>>> abc
'abc'
>>> (abc)
'abc'
>>> (abc,)
('abc',)
如果您希望函数在封面下以不同方式处理列表和字符串,请将您的函数编码为:
def f(maybe_list):
if not isinstance(maybe_list, list):
maybe_list = [maybe_list]
# carry on, you have a list.
答案 1 :(得分:2)
如果您尝试接受单个字符串或字符串列表作为函数的输入,但是后来要确保您始终使用后续部分中的列表代码,你可以检查参数的类型,并在必要时进行转换:
def listify(arg):
return input if isinstance(arg, list) else [input]
listify("hello")
['hello']
listify(["hi", "howdy"])
['hi', 'howdy']
这不必作为单独的函数发生,我只是把它放在一个函数中来快速说明。您也可以直接分配给变量而不是返回。
答案 2 :(得分:2)
这是一个快速的方法:
#!python
myString = 'some string'
myList = list()
myList.append(myString)
...请注意,.append()
会将单个项目添加到列表中,而.extend()
会将一系列项目添加到列表中。
您遇到的问题是Python字符串也是一系列字符(因此是#34;可迭代的#34;)。所以类似于:list(myString)
对待myString
就像处理任何其他可迭代一样。 (从概念上讲,通过实例化一个空列表,迭代初始化内容并将每个内容附加到新实例化的列表来完成。)
答案 3 :(得分:2)
>>> s = "abc"
>>> if isinstance(s, str):
... s = [ s ]
>>> s
['abc']
如前所述,您可以将此检查作为单独的功能。
你也可以使用三元运算符编写一个单行程序(自Python 2.5起引入):
s = s if isinstance(s, list) else [ s ]