在Python中,字符串可以循环/迭代,就像列表、元组等一样。我们对 dict 和 bytes 也有相同的。因此,使用 isinstance 与任何 collections.abc 类相比,在列表、字节、字典等上都会给出 True
我正在寻找一种优雅的方法来检查我是否收到了方法的类似列表的参数:列表、元组、集合、numpy 数组、pandas 系列等?
您有什么建议不是测试是否可迭代,而是字符串或字典等吗
我真的很想匹配非开发人员对列表的直观理解。
另一个选项是检查您的变量是否是 Iterable,但手动排除您认为不应该接受的变量:
from collections.abc import Iterable
excluded_types = (str, dict)
if isinstance(obj, Iterable) and not isinstance(obj, excluded_types):
do_something()
但是您应该定义您期望考虑“类似列表”的可迭代行为。
您可以为此创建自己的函数:
import numpy as np
import pandas as pd
def is_list_like(obj):
valid_types = (list, tuple, set, np.ndarray, pd.Series)
return isinstance(obj, valid_types)
这适用于您喜欢使用的“类列表”的任意定义 - 只需从
valid_types
元组中添加/删除类型。
假设您正在使用
numpy
,您可以构造一个数组并检查其维度。任何 ndim
为零几乎 的内容都符合您的定义。
>>> import numpy as np
>>> f = np.asarray("hello") # string
>>> f.ndim
0
>>> f=np.asarray({1:2,3:4}) # dict
>>> f.ndim
0
>>> f=np.asarray([1,2,3,4]) # list
>>> f.ndim
1
>>> f=np.asarray((1,2,3,4)) # tuple
>>> f.ndim
1
不幸的是,这似乎不适用于
set
。
>>> f=np.asarray({1,2,3,4}) # set
>>> f.ndim
0