Python 不区分列表和字符串的len()?

Python doesn't differentiate len() of list and string?

例如我有这个 pandas 简单数据框:

>> print(file)
       Name
    0  ['junior','senior']
    1  freshgrad

当我尝试使用 :

>> len(file[0])
2

但是第二个

>> len(file[1])
9

但是我想要第二个计算为1这两个怎么区分?

  1. 我试过使用 .join() 但它仍然计算为 9
  2. 我试过了list.count但是我遇到了一个错误

您可以定义自己的长度函数,它使用类型来确定如何计算长度:

def mylen(data):
    return len(data) if isinstance(data,list) else 1

最好的方法是检查相关项目的数据类型。您可以使用:

if isinstance(item, list):
    ...

并且:

if isinstance(item, str):
    ...

如果是字符串,您可以根据需要使用 1 作为长度。请注意,使用 isinstance(item, dtype)type(item) == dtype 更好,因为它会自动处理子类类型。

freshgrad 是一个字符串
所以 len(file[1]) 意味着你正在计算这个 string.It 的长度是 9.
如果 file[1] 是一个包含 freshgrad like['freshgrad'] 的列表,len(file[1]) 将为 1.

你可以使用 np.size:

In [301]: file = pd.Series([['junior','senior'], 'freshgrad'])

In [302]: file.apply(np.size)
Out[302]: 
0    2
1    1
dtype: int64

In [327]: np.size(file[0])
Out[327]: 2

In [328]: np.size(file[1])
Out[328]: 1

但在某种程度上,这可能只是在延迟你的痛苦。当物体在 一个系列(或任何种类的序列)有不同的类型,代码往往需要类型检查或 try..excepts 以不同方式处理各种类型。 (事实上​​,这就是 np.size 正在做的事情。在幕后 np.size 正在使用 try..except 来处理异常情况。)

当一个序列中的所有对象都具有相同类型时,生活通常会更简单(因此更好)。所以最好建一个Series,其元素都是列表:

In [301]: file = pd.Series([['junior','senior'], ['freshgrad']])