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

python中比较两个列表的最佳算法,python,sorting,Python,Sorting,我有两个python列表(list1和list2),其中填充了自己的数据类型。 我想将这些列表与列表进行比较,并将这些列表的所有元素都交给stdout(或其他地方),但要按照特定的顺序(不以任何方式对列表进行排序) 列表1和列表2可以包含不在其他列表中的元素,但也可以包含在其他列表中的元素。两个列表中的这些元素应该在同一行输出。但是,只有一个列表中的元素,在最后也应该按正确的顺序排列 例如: List1 = [A,B,C,D,F,H,G]; List2 = [A,C,D,E,H]; outpu

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

列表1和列表2可以包含不在其他列表中的元素,但也可以包含在其他列表中的元素。两个列表中的这些元素应该在同一行输出。但是,只有一个列表中的元素,在最后也应该按正确的顺序排列

例如:

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

如何以这种方式“排序”?

一种简单的方法

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

如果要对齐字符串以外的内容,则应使用
difflib.SequenceMatcher
而不是
difflib.different

导入difflib def校准(a、b): 返回和((zip(a[i1:i2],b[j1:j2]),如果标记=='equal' else映射(无,a[i1:i2],])+映射(无,[],b[j1:j2]) 对于标签i1、i2、j1、j2 在difflib.SequenceMatcher中(无、a、b).get_操作码(),[]) 整数示例:

结果:

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

作为一个反问题,你怎么能在不排序的情况下按排序的顺序打印列表呢?所以它不是真正排序的。排序意味着,对我来说,我可以更改列表中元素的顺序,但这是我不想做的(或者:我不能做)。这是输出的一个示例;)但是您确实更改了示例中元素的顺序。编辑后,这是我自己的错误。我仍然不确定所需的行为是什么。如果输入是:List1=[A,B,C,H,G,D,F,];列表2=[C,D,E,H,A]?是的,我看到了,谢谢。但是我很快就会更改它。它是k,然后拒绝我的更改并自己更改:)您的键函数完全没有必要<代码>排序在没有它的情况下会产生完全相同的输出。此外,您对for循环中成员身份的测试提供了二次性能。不好。这只是为了得到字母顺序的结果。让我澄清一下:
sorted(List3,key=lambda item:item)==sorted(List3)
计算结果为
True
。但这不是我投反对票的原因。投反对票的是不必要的低效算法。
  1  |  1  
  2  |  2  
     |  3  
  4  |  4  
  5  |     
     |  6  
  7  |  7