一行检查字符串或列表,然后在Python中转换为列表

时间:2016-08-08 05:00:33

标签: python

假设我有一个对象a,可以是字符串(如'hello''hello there')或列表(如['hello', 'goodbye'])。我需要检查a是否是字符串或列表。如果它是一个字符串,那么我想将其转换为一个元素列表(因此将'hello there'转换为['hello there'])。如果它是一个列表,那么我想把它作为一个列表。

是否有Pythonic单行代码才能执行此操作?我知道我能做到:

if isinstance(a, str):
    a = [a]

但是我想知道是否有一个更直接,更Pythonic的单线来做到这一点。

4 个答案:

答案 0 :(得分:4)

您可以使用三元运算符:

a = [a] if isinstance(a, str) else a

答案 1 :(得分:1)

[a] if isinstance(a, str) else a

答案 2 :(得分:1)

我更喜欢其他选项,而不是isinstance

b = [a] if type(a) is str else a
print(b)

可以采取相反的方式:

b = a if type(a) is list else [a]

甚至让它变得有点健壮:

b = a if type(a) in [list, tuple] else [a]

如果你也处理元组。

答案 3 :(得分:0)

这适用于字符串和字符串列表/元组/字符串集。此外,它将None转换为空列表。

from typing import List, Optional, Set, Tuple, Union

def ensure_list(s: Optional[Union[str, List[str], Tuple[str], Set[str]]]) -> List[str]:
    # Ref: https://stackoverflow.com/a/56641168/
    return s if isinstance(s, list) else list(s) if isinstance(s, (tuple, set)) else [] if s is None else [s]

测试:

>>> ensure_list('abc')
['abc']
>>> ensure_list(['a', 'bb', 'ccc'])
['a', 'bb', 'ccc']
>>> ensure_list(('a', 'bb', 'ccc'))
['a', 'bb', 'ccc']
>>> ensure_list({'a', 'bb', 'ccc'})
['ccc', 'a', 'bb']
>>> ensure_list(None)
[]
>>> ensure_list('')
['']

如果您不想将None转换为空列表,请删除else [] if s is None