2017-07-19 49 views
1

こんにちは、長さが違う2つのリストを比較し、各テーブルに欠落している項目があるソートされたテーブルを印刷したいと思います。これを部分的に実行して、list_2にない値を表示することができます。しかし、私はlist_1に欠けている値をlist_2、文字 'z'からも印刷することはできません。どのようにしてこれを実行して、以下の出力を得ることができますか?Python異なる長さの2つのリストを比較する

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

答えて

2

一つの解決策は、元の2つのリストのすべての要素が含まれている3番目のリストを使用している可能性があります。次に、新しいリストをソートし、それを反復しながら、元のリストの3番目のリストの要素の存在を確認することができました。実際には3番目のリストをセットにする方が良いでしょう。 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)) 

出力:OrderedDictが仕事をするように思わ使用し

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これはあなたのデータを並べ替えます。あなたはそれがあなたが望んでいると確信していますか? –

1

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  
0

は、あなたがそれを用いリストcomprehensiを行うことができますに!

>>> 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 
関連する問題