[英]comparing two lists of different lengths generated from Counter() python
[英]Python Comparing two lists with different lengths
嗨,我想比較兩個不同長度的列表,並打印一個排序表與每個表中缺少的項目。 我部分能夠完成此操作並打印list_2中缺少的值。 但是我無法在list_2中打印list_1中缺少的值,即字母“z”。 如何執行此操作以獲得下面所需的輸出?
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
一種解決方案可能是使用包含兩個原始列表的所有元素的第三個列表。 然后我們可以對新列表進行排序,並在迭代它時,我們可以檢查原始列表中第三個列表的元素是否存在。 實際上將第三個列表設置為一組會更好。 根據Patrick Haugh
的建議,我們應該在迭代之前將原始列表轉換為集合。 因此,該過程將更有效。 為什么? 關注這篇文章。 哪個更快,為什么? 設置還是列出?
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
使用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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.