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

时间:2016-05-26 01:41:04

标签: python list pandas string-length

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

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

当我尝试使用时:

>> len(file[0])
2

但是对于第二个

>> len(file[1])
9

但我希望第二个计算为1如何区分这两者?

  1. 我尝试使用.join(),但仍然计算为9
  2. 我试过list.count但是我收到了错误

5 个答案:

答案 0 :(得分:1)

执行所需操作的最佳方法是检查相关项目的数据类型。您可以使用:

if isinstance(item, str):
    ...

isinstance(item, dtype)

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

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

freshgrad是一个字符串
所以len(文件[1])意味着你要计算这个字符串的长度。它是9 如果file [1]是包含[' freshgrad']等freshgrad的列表,则len(文件[1])将为1.

答案 3 :(得分:0)

Python Doc说关于函数len

返回对象的长度(项目数)。参数可以是序列(例如字符串,字节,元组,列表或范围)或集合(例如字典,集合或冻结集)

请参阅https://docs.python.org/3/library/functions.html#len

换句话说

>>> len('freshgrad') 9 because returns the size of string
>>> len(['freshgrad']) 1 because returns the size of array

答案 4 :(得分:0)

您可以使用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..except以不同的方式处理各种类型。 (事实上​​,这就是np.size正在做的事情。np.size正在使用try..except来处理异常情况。)

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

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