假设我有一个对象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]