我在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
我怎样才能以这种方式“排序”?
答案 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