错误:'int'类型的对象没有len()

时间:2016-09-09 21:35:53

标签: python arrays sorting

我有一个函数应该接受一个数组,并将它从最小的字符串大小排序到最大的字符串,然后使用注入排序打印它。

在线:while (j >=0) and (len(b[j]) > key):

我收到此错误:

  

类型'int'的对象没有len()

代码:

def list_sort(b):
    for i in range(1, len(b)):
        key = len(b[i])
        j = i - 1 
        while (j >=0) and (len(b[j]) > key):
            b[j+1] = b[j]
            j = j - 1
        b[j+1] = key
    for i in range( len(b) ):
        print (b[i])

list_sort(name)

3 个答案:

答案 0 :(得分:2)

我不确定您是如何生成错误的,因为["alice", "bob", "sally"]的输入没有崩溃,但确实会生成数字。

这可能是因为您指定了b_list[j+1] = keyValue,其中keyValue = len(b_list[i]),这将是一个int,因此,如果您再次点击该元素,并尝试len()在它上面,这是你看到的错误。

现在,从Wikipedia pseudo-code

重新实现此功能
def insertion_sort(A):
    for i in range(1, len(A)):
        j = i
        s1 = A[j-1]
        s2 = A[j]
        while j > 0 and len(s1) > len(s2):
            # swap A[j] and A[j-1]
            tmp = A[j-1]
            A[j-1] = A[j]
            A[j] = tmp

            j = j - 1

name_list = ["alice", "bob", "sally"]
insertion_sort(name_list)

for name in name_list:
    print name

打印

bob
alice
sally

答案 1 :(得分:1)

您可以使用atleast_1d()tolist()来确保在处理可能的标量和数组/列表混合时,对象将具有len()

答案 2 :(得分:1)

听起来你有一个整数和字符串的混合列表,并希望按字符串的长度排序。如果是这种情况,请在排序之前将整个列表转换为类似的类型 - 字符串。

假设:

>>> li=[1,999,'a','bbbb',0,-3]

你可以这样做:

>>> sorted(map(str, li), key=len)   
['1', 'a', '0', '-3', '999', 'bbbb']

如果您希望按长度排序两个密钥,那么可以执行:

>>> sorted(map(str, li), key=lambda e: (len(e), e))
['0', '1', 'a', '-3', '999', 'bbbb']

您可以在不更改对象类型的情况下进行排序,方法是将str添加到键功能中:

>>> sorted(li, key=lambda e: (len(str(e)), str(e)))
[0, 1, 'a', -3, 999, 'bbbb']