我的任务是将列表合并为一个列表。例如:
all_lst = [[2, 7, 10], [0, 4, 6], [3, 11]]
>>> [0, 2, 3, 4, 6, 7, 10, 11]
我定义了:
def merge(left, right):
results = []
while left and right:
if left[0]< right[0]:
results.append( left[0])
left.remove( left[0])
else:
results.append( right[0])
right.remove (right[0])
results.extend(left)
results.extend(right)
return results
和
def merge_lists(all_lst):
for i in range( len(all_lst)):
A = merge(all_lst[i], all_lst[ i+1])
new = all_lst[i+2:]
B = merge( list(A), list(new))
return B
然而我是由IDLE给出的:
Traceback (most recent call last):
File "<pyshell#162>", line 1, in <module>
print(merge_lists(all_lst))
File "<pyshell#161>", line 5, in merge_lists
B = merge( list(A), list(new))
File "<pyshell#110>", line 4, in merge
if left[0]< right[0]:
TypeError: unorderable types: int() < list()
如果你能告诉我什么是错的,我真的很感激。感谢〜!
答案 0 :(得分:1)
all_lst
是列表,然后,当你做
new = all_lst[i+2:]
new
也将是一个列表列表(因为列表切片),然后当你这样做时:
B = merge(A, new) # cast to list is not necessary, since both are already lists
在
行if left[0]< right[0]:
您正在访问第一个元素。在列表A
中,第一个元素将是整数,但在列表new
(列表列表)中,第一个元素将是列表。这就是你得到这个错误的原因。
注意:强>
答案 1 :(得分:1)
不要试图重新发明这个问题。使用itertools
中的chain
,如下所示:
>>> import itertools as it
>>> i = [[2, 7, 10], [0, 4, 6], [3, 11]]
>>> sorted(it.chain(*i))
[0, 2, 3, 4, 6, 7, 10, 11]
需要排序调用,因为您需要订购结果。
答案 2 :(得分:1)
使用reduce:
sorted(reduce(lambda r,x:r+x,all_lst[1:],all_lst[0]))
result = all_lst[0]
[result.extend(i) for i in all_lst[1:]]
print sorted(result)