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

pla*_*lam 6 python

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

是否有Pythonic单行代码可以做到这一点?我知道我可以做:

if isinstance(a, str):
    a = [a]
Run Code Online (Sandbox Code Playgroud)

但是我想知道是否有更直接,更Pythonic的代码可以做到这一点。

Tig*_*kT3 8

您可以使用三元运算符:

a = [a] if isinstance(a, str) else a
Run Code Online (Sandbox Code Playgroud)


sna*_*ile 6

[a] if isinstance(a, str) else a
Run Code Online (Sandbox Code Playgroud)


Acu*_*nus 5

这适用于字符串和字符串列表/元组/集合。此外,它将 a 转换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]
Run Code Online (Sandbox Code Playgroud)

测试:

>>> 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('')
['']
Run Code Online (Sandbox Code Playgroud)

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