代码之家  ›  专栏  ›  技术社区  ›  Ralph Deint

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

  •  0
  • Ralph Deint  · 技术社区  · 8 年前

    例如,我有一个熊猫简单数据框:

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

    当我尝试使用:

    >> len(file[0])
    2
    

    但对于第二个

    >> len(file[1])
    9
    

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

    1. 我试过用 .join() 但仍计算为 9
    2. 我已经试过了 list.count 但我犯了个错误
    4 回复  |  直到 8 年前
        1
  •  2
  •   Tom Karzes    8 年前

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

    if isinstance(item, list):
        ...
    

    和:

    if isinstance(item, str):
        ...
    

    对于字符串,如果愿意,可以使用1表示长度。请注意,最好使用 isinstance(item, dtype) type(item) == dtype 因为它将自动处理子类类型。

        2
  •  0
  •   Li Yingjun    8 年前

    新生是一个字符串
    所以len(文件[1])表示您正在计算这个字符串的长度。现在是9点。
    如果文件[1]是包含类似于['freshgrad']的freshgrad的列表,则len(文件[1])将为1。

        3
  •  0
  •   unutbu    8 年前

    你可以用 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.尺寸 正在进行。发动机罩下面 np.尺寸 正在使用 尝试..除外 以处理例外情况。)

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

    In [301]: file = pd.Series([['junior','senior'], ['freshgrad']])
    
        4
  •  0
  •   Scott Hunter    8 年前

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

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