【问题标题】:Python Comparing two lists with different lengthsPython比较两个不同长度的列表
【发布时间】:2017-12-24 03:32:20
【问题描述】:

您好,我想比较两个不同长度的列表,并打印一个排序表,其中包含每个表中缺少的项目。我部分能够完成此操作并打印 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

【问题讨论】:

  • 你考虑过使用set吗?试试set(list_2) - set(list_1)
  • 这确实提供了缺失值,但不确定在 for 循环期间如何制作表格的那部分。

标签: python list loops


【解决方案1】:

一种解决方案可能是使用包含两个原始列表的所有元素的第三个列表。然后我们可以对新列表进行排序,并在对其进行迭代时,我们可以检查原始列表中是否存在第三个列表的元素。实际上,将第三个列表设为一组会更好。根据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

【讨论】:

  • 小幅改进,但如果您保存set(list_1)set(list_2),您可以在以后进行查找时节省时间。
  • @MBasith 这会对您的数据进行排序。你确定这就是你想要的吗?
  • "...比较两个不同长度的列表并打印一个sorted table,其中包含每个表中缺少的项目。"这就是对第三个列表进行排序的原因。
【解决方案2】:

使用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      

【讨论】:

    【解决方案3】:

    您也可以使用列表推导来做同样的事情!

    >>> 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
    

    【讨论】:

      猜你喜欢
      • 2021-02-25
      • 2018-07-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-17
      • 2021-03-18
      • 1970-01-01
      • 2018-12-07
      相关资源
      最近更新 更多