【问题标题】:How to compare two nested lists?如何比较两个嵌套列表?
【发布时间】:2020-10-09 13:47:08
【问题描述】:

我有两个嵌套列表。这两个列表非常相似,它们是同一文件的不同版本,彼此叠加。

列表结构类似于list = [[name, version, id],[name, version, id], ...]

list_1 = [
['mipl-abnd','v1.0.2','eelp234'],
['mipl-avfd','v1.1.5','32fv423'],
['mipl-awsd','v9.0.2','234eelp'],
['mipl-tgfd','v3.0.0','124fdge'],
['mipl-hrdss','v1.0.2','543rfd3'],
['mipl-oldss','v1.0.2','eelp234']] 

list_2 = [
['mipl-abnd','v1.0.2','eelp234'],
['mipl-avfd','v1.1.6','3254323'],
['mipl-awsd','v9.0.2','234eelp'],
['mipl-tgfd','v3.0.0','124fdge'],
['mipl-hrdss','v1.0.2','543rfd3'],
['mipl-newss','v1.0.2','eelp234']] 

我想迭代并比较list_1 中的名称是否存在于list_2 中,如果存在,则list_1 中该组件的版本是否不等于list_2 中该组件的版本(如果有库的版本升级),则为所有独特情况打印newlist_1 = [name, old version, new version, old id, new id]

如果list_1 中存在名称,而list_2 中不存在该名称,则表示不推荐使用库,在这种情况下,新的输出列表应包含newlist_2 = [name, old version, 'deprecated', old id, 'deprecated']

如果list_2中有名称,而list_1中不存在,则意味着新添加了一个库,在这种情况下,新的输出列表应该包含newlist_3 = [name, 'new', new version, new, new id]

最终输出应该是 3 个列表,应该得到:

newlist_1 = ['mipl-avfd', 'v1.1.5', 'v1.1.6','32fv423', '3254323']
newlist_2 = ['mipl-oldss','v1.0.2', 'deprecated','eelp234', 'deprecated']
newlist_3 = ['mipl-newss', 'new','v1.0.2','new', 'eelp234']

我试着写这样的东西:

for items in list_1:
    for item in list_2: 
        if item[0] == items[0] and item[1] != items[1]:
             list_difference = [item[0], items[1], item[1], items[2], items[2]]
             newlist_1.append(list_difference)
        elif item[0] not in items[0]: 
             list_old_param = [item[0], item[1], 'deprecated', items[2], 'not-exist']
             newlist_2.append(list_old_param)
        elif items[0] not in item[0]:
             list_new_param = [item[0], 'new' , items[1], 'new', items[2]]
             newlist_3.append(list_new_param)
 

由于两个for 循环,所有数据似乎都附加并创建了多个条目,那么我如何理解列表?

问题:如何使其仅附加唯一条目?有哪些聪明的方法可以编写代码来比较这两个列表?最简单的方法是什么?由于列表会不断变化,如何确保循环不会过度拟合这些列表?

【问题讨论】:

    标签: python nested-loops nested-lists


    【解决方案1】:

    另一种方法是依次遍历每个列表,在另一个列表中查找名称。您可以使用两个dicts 直接访问。

    我下面的函数通过将列表转换为字典并遍历每个 dict 并尝试访问另一个中的名称来准备数据。

    list_1 = [
    ['mipl-abnd','v1.0.2','eelp234'],
    ['mipl-avfd','v1.1.5','32fv423'],
    ['mipl-awsd','v9.0.2','234eelp'],
    ['mipl-tgfd','v3.0.0','124fdge'],
    ['mipl-hrdss','v1.0.2','543rfd3'],
    ['mipl-oldss','v1.0.2','eelp234']] 
    
    
    list_2 = [
    ['mipl-abnd','v1.0.2','eelp234'],
    ['mipl-avfd','v1.1.6','3254323'],
    ['mipl-awsd','v9.0.2','234eelp'],
    ['mipl-tgfd','v3.0.0','124fdge'],
    ['mipl-hrdss','v1.0.2','543rfd3'],
    ['mipl-newss','v1.0.2','eelp234']]
    
    def compareLists(l1, l2):
        d1 = {k:[v1,v2] for k,v1,v2 in l1}
        d2 = {k:[v1,v2] for k,v1,v2 in l2}
        result = []
        for k,v in d2.items():
            if k in d1:
                v1 = d1[k]
                if v1[0] != v[0]:
                    result.append([k,v1[0],v[0], v1[1],v[1]])
            else:
                result.append([k,'new',v[0],'new', v[1]])
    
        for k,v in d1.items():
            if k not in d2:
                result.append([k,v[0],'deprecated', v[1], 'deprecated'])
        
        return result
    
    r = compareLists(list_1,list_2)
    for d in r:
        print(d)
    

    根据需要输出。

    【讨论】:

    • 谢谢你,这样就可以了。我从来没有同时玩过列表和字典。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-05
    相关资源
    最近更新 更多