J'ai une fonction qui prend une variable qui fonctionnerait si c'est l'un des trois types suivants
1. pandas Series
2. numpy array (ndarray)
3. python list
Tout autre type doit être rejeté. Quelle est la manière la plus efficace de vérifier cela?
Vous pouvez le faire en utilisant isinstance
:
import pandas as pd
import numpy as np
def f(l):
if isinstance(l,(list,pd.core.series.Series,np.ndarray)):
print(5)
else:
raise Exception('wrong type')
f([1,2,3])
imprime 5 tandis que f(3.34)
déclenche une erreur.
Le type Python () devrait faire le travail ici
l = [1,2]
s= pd.Series(l)
arr = np.array(l)
Lorsque vous imprimez
type(l)
list
type(s)
pandas.core.series.Series
type(arr)
numpy.ndarray
Tout cela dépend vraiment de ce que vous essayez de réaliser (allez-vous autoriser un tuple, que diriez-vous d'un objet range
?), Mais être un peu moins restrictif mais toujours interdire les chaînes (ce qui, je suppose, est ce que vous tentent vraiment d'atteindre), vous pouvez utiliser le code suivant.
import collections
import pandas
import numpy
def myfunc(x):
if not isinstance(x, collections.abc.Iterable) or isinstance(x, (str, bytes)):
raise ValueError('A non-string iterable is required')
return 'Yay!'
myfunc([9, 7])
myfunc((9, 7))
myfunc(numpy.arange(9))
myfunc(range(9))
myfunc(pandas.Series([9, 7]))
myfunc('Boo') # THIS WILL RAISE A ValueError!!!!!
Vous pouvez utiliser une instance comme celle-ci:
import pandas as pd
import numpy as np
#Simple List
simple_list = [1,2]
#numpy array
np_array = np.array(simple_list)
#Pandas series
pandas_series = pd.Series(simple_list)
if isinstance(simple_list, list):
print("This is a list: ", simple_list)
if isinstance(np_array, np.ndarray):
print("This is a numpy array: ", np_array)
if isinstance(pandas_series, pd.core.series.Series):
print("This is pandas series: ", pandas_series)