繁体   English   中英

python 检查列表,但不是字符串、字节、字典等

[英]python checking list-like but not string, bytes, dicts, etc

在 python 中,字符串可以循环/迭代,就像列表、元组等一样。 我们对 dict 和 bytes 也有同样的看法。 因此,使用 isinstance 与任何 collections.abc 类在列表、字节、字典等上给出 True。

我正在寻找一种优雅的方法来检查我是否收到了方法的类似列表的参数:列表、元组、集合、numpy 数组、pandas 系列等?

你有什么建议不是测试是否可迭代,而是字符串和字典等。

我真的在尝试匹配非开发人员对列表是什么的直观理解。

谢谢。

另一种选择是检查您的变量是否是可迭代的,但手动排除您认为不应接受的内容:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM