合并各种列表

时间:2014-03-19 04:52:07

标签: python

我的任务是将列表合并为一个列表。例如:

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()

如果你能告诉我什么是错的,我真的很感激。感谢〜!

3 个答案:

答案 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]))

使用list comprehensionextend

result = all_lst[0]
[result.extend(i) for i in all_lst[1:]]
print sorted(result)