比较python中两个列表的最佳算法

时间:2015-04-16 13:00:08

标签: python sorting

我在python中有两个列表(list1和list2),它们填充了自己的数据类型。 我想将这些列表与列表进行比较,并将这些列表的所有元素提供给stdout(或其他地方),但是按特定顺序(不以任何方式对列表进行排序)。

List1和List2可以包含不在其他列表中的元素,但也可以包含在另一个列表中的元素。这两个列表中的元素应该在同一行输出。但是,仅在一个列表中出现的元素,最后也应该是正确的顺序。

示例:

List1 = [A,B,C,D,F,H,G];
List2 = [A,C,D,E,H];

output should be:

List1 |List2
  A      A
  B      
  C      C
  D      D
         E
  F
  H      H
  G

我怎样才能以这种方式“排序”?

3 个答案:

答案 0 :(得分:2)

import difflib, re

list_a = ['A', 'B', 'C', 'D', 'F', 'H', 'G']
list_b = ['A', 'C', 'D', 'E', 'H']

for i in difflib.Differ().compare(list_a, list_b):
    differ_char, letter = re.match(r'([\s\-+]) ([A-Z])', i).groups()
    choices = ['  ' + letter, letter + '  ', letter + ' ' + letter]
    print choices[['+', '-', ' '].index(differ_char)] # print lines

答案 1 :(得分:1)

如果您想要与字符串对齐,请使用difflib.SequenceMatcher代替difflib.Differ

import difflib
def align(a, b):
    return sum((zip(a[i1:i2], b[j1:j2]) if tag == 'equal' 
                  else map(None, a[i1:i2], []) + map(None, [], b[j1:j2])
                        for tag, i1, i2, j1, j2 
                        in difflib.SequenceMatcher(None, a, b).get_opcodes()), [])

整数示例:

list_a = [1, 2,    4, 5,    7]
list_b = [1, 2, 3, 4,    6, 7]

for (a,b) in align(list_a, list_b):
    print '{0:^5}|{1:^5}'.format(a or '',b or '')

结果:

  1  |  1  
  2  |  2  
     |  3  
  4  |  4  
  5  |     
     |  6  
  7  |  7  

答案 2 :(得分:-1)

一种简单的方法。

List1 = ['A','B','C','D','F','H','G']
List2 = ['A','C','D','E','H']

List3 = set(List1 + List2)
for i in sorted(List3, key=lambda item: item):
    if i in List1 and i in List2:
            print('{0} | {0}'.format(i))
    elif i in List1:
        print('{0} | '.format(i))
    elif i in List2:
        print('  | {0}'.format(i))

A | A
B | 
C | C
D | D
  | E
F | 
G | 
H | H