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



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

是否有一个python的一行代码来做这个?我知道我能做到:

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

但是我想知道是否有一个更直接的,更python化的一行代码来做到这一点。

可以使用三元操作符:

a = [a] if isinstance(a, str) else a
[a] if isinstance(a, str) else 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]
测试:

>>> 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

我更喜欢其他选项,而不是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]

最新更新