我有一个函数应该接受一个数组,并将它从最小的字符串大小排序到最大的字符串,然后使用注入排序打印它。
在线: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)
答案 0 :(得分:2)
我不确定您是如何生成错误的,因为["alice", "bob", "sally"]
的输入没有崩溃,但确实会生成数字。
这可能是因为您指定了b_list[j+1] = keyValue
,其中keyValue = len(b_list[i])
,这将是一个int,因此,如果您再次点击该元素,并尝试len()
在它上面,这是你看到的错误。
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']