[英]Python : transform complex list-like string into list (without SyntaxError for mixing bytes and nonbytes literal)
[英]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.