python中比较两个列表的最佳算法
我有两个python列表(list1和list2),其中填充了自己的数据类型。 我想将这些列表与列表进行比较,并将这些列表的所有元素都交给stdout(或其他地方),但要按照特定的顺序(不以任何方式对列表进行排序) 列表1和列表2可以包含不在其他列表中的元素,但也可以包含在其他列表中的元素。两个列表中的这些元素应该在同一行输出。但是,只有一个列表中的元素,在最后也应该按正确的顺序排列 例如: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
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