Python比较两个不同长度的列表

问题描述:

嗨我想比较两个不同长度的列表,并打印每个表中缺少项的已排序表。我部分能够完成此操作并打印list_2中缺少的值。但我无法打印list_2中缺少的值,即字母'z'。我如何执行此操作以获得以下所需的输出?Python比较两个不同长度的列表

list_1 = ['a', 'b', 'c', 'd', 'e', 'f'] 
list_2 = ['b', 'c', 'f', 'z'] 

table_format = '{:<10} {:<10}' 
print(table_format.format('list_1', 'list_2')) 
print('-' * 20) 
for x in list_1: 
    for y in list_2: 
     if x in y: 
      print(table_format.format(x, y)) 
      break 
    else: 
     print(table_format.format(x,'Missing')) 

电流输出:

list_1  list_2  
-------------------- 
a   Missing 
b   b   
c   c   
d   Missing 
e   Missing 
f   f   

所需的输出:

list_1  list_2  
-------------------- 
a   Missing 
b   b   
c   c   
d   Missing 
e   Missing 
f   f  
Missing z 
+0

你有没有考虑过使用['set'](https://docs.python.org/3/tutorial/datastructures.html#sets)?尝试'set(list_2) - set(list_1)' –

+0

这确实提供了缺少的值,但不知道如何在for循环中创建表的那部分。 – MBasith

一种解决方案可能是使用一个包含两个原始列表中的所有元素的第三列表。然后,我们可以对新列表进行排序,并且在迭代它的同时,我们可以检查原始列表中是否存在第三个列表的元素。实际上让第三个列表更好。根据Patrick Haugh的建议,我们应该在迭代之前将原始列表转换为集合。因此这个过程将会更有效率。为什么?关注这篇文章。 Which is faster and why? Set or List?

list_1 = set(['a', 'b', 'c', 'd', 'e', 'f']) # Or list_1 = {'a', 'b', 'c', 'd', 'e', 'f'} 
list_2 = set(['b', 'c', 'f', 'z']) # list_2 = {'b', 'c', 'f', 'z'} 

list_3 = set(list_1 | list_2) 
table_format = '{:<10} {:<10}' 
print(table_format.format('list_1', 'list_2')) 
print('-' * 20) 
for elem in sorted(list_3): 
    if elem in list_1: 
     if elem in list_2: 
      print(table_format.format(elem, elem)) 
     else: 
      print(table_format.format(elem, 'Missing')) 
    else: 
     print(table_format.format('Missing', elem)) 

输出:

list_1  list_2  
-------------------- 
a   Missing 
b   b   
c   c   
d   Missing 
e   Missing 
f   f   
Missing z 
+1

稍有改进,但如果保存'set(list_1)'和'set(list_2)',则可以在稍后执行查找时节省时间。 –

+1

这工作得很好。感谢您的帮助和提示! – MBasith

+0

@MBasith这样排序你的数据。你确定这就是你想要的吗? –

使用一个OrderedDict似乎做的工作:

from collections import OrderedDict 

list_1 = ['a', 'b', 'c', 'd', 'e', 'f'] 
list_2 = ['b', 'c', 'f', 'z'] 

mapping = OrderedDict() 
for x in list_1: 
    mapping[x] = x if x in list_2 else 'Missing' 

for x in list_2: 
    mapping[x] = x if x in list_1 else 'Missing' 

table_format = '{:<10} {:<10}' 
print(table_format.format('list_1', 'list_2')) 
print('-' * 20) 

for k in mapping: 
    if k in list_1: 
     print(table_format.format(k, mapping[k])) 
    else: 
     print(table_format.format(mapping[k], k)) 

输出:

list_1  list_2  
-------------------- 
a   Missing 
b   b   
c   c   
d   Missing 
e   Missing 
f   f   
Missing z  

你可以做同样的使用清单性能综合上!

>>> print "\n".join(map(str,['list_1\tlist_2\n---------------']+[(each if each in list_1 else 'missing')+'\t'+(each if each in list_2 else 'missing') for each in sorted(set(list_1+list_2))])) 
list_1 list_2 
--------------- 
a  missing 
b  b 
c  c 
d  missing 
e  missing 
f  f 
missing z 

我已经打破了理解,以更好的理解!

>>> [each if each in list_1 else 'missing' for each in sorted(set(list_1+list_2))] 
['a', 'b', 'c', 'd', 'e', 'f', 'missing'] 

>>> [each if each in list_2 else 'missing' for each in sorted(set(list_1+list_2))] 
['missing', 'b', 'c', 'missing', 'missing', 'f', 'z'] 

>>> [(each if each in list_1 else 'missing',each if each in list_2 else 'missing') for each in sorted(set(list_1+list_2))] 
[('a', 'missing'), ('b', 'b'), ('c', 'c'), ('d', 'missing'), ('e', 'missing'), ('f', 'f'), ('missing', 'z')] 

>>> [['list_1','list_2']]+[(each if each in list_1 else 'missing',each if each in list_2 else 'missing') for each in sorted(set(list_1+list_2))] 
[['list_1', 'list_2'], ('a', 'missing'), ('b', 'b'), ('c', 'c'), ('d', 'missing'), ('e', 'missing'), ('f', 'f'), ('missing', 'z')] 

>>> print "\n".join(map(str,[['list_1','list_2']]+[(each if each in list_1 else 'missing',each if each in list_2 else 'missing') for each in sorted(set(list_1+list_2))])) 
['list_1', 'list_2'] 
('a', 'missing') 
('b', 'b') 
('c', 'c') 
('d', 'missing') 
('e', 'missing') 
('f', 'f') 
('missing', 'z') 

>>> print "\n".join(map(str,['list_1\tlist_2\n---------------']+[(each if each in list_1 else 'missing')+'\t'+(each if each in list_2 else 'missing') for each in sorted(set(list_1+list_2))])) 
list_1 list_2 
--------------- 
a  missing 
b  b 
c  c 
d  missing 
e  missing 
f  f 
missing z