缺少列表项时将列表列表与附加值结合

时间:2019-07-12 15:51:15

标签: python list

我需要合并列表列表,并在其他列表中不存在项目时添加项目。

我需要一种方法来表示三个列表中的某个列表中的值不存在。在下面的示例中,['e','f']仅在列表1(l1)中,因此将在列表2(l2)和列表3(l3)中添加一个占位符以表示它在列表1中,但不在列表2和3中。占位符类似于['e','-']

l1 = [['a', 'b'],['e','f']]
l2 = [['a', 'b'],['c', 'd']]
l3 = [['a', 'b'],['c', 'd']]

因此,最后,每个列表都将有一个列表项第一位置具有唯一值的任何列表项条目。

l1 = [['a', 'b'],['c','-'],['e','f']
l2 = [['a', 'b'],['c','d'],['e','-']
l3 = [['a', 'b'],['c','d'],['e','-']

我尝试将列表列表转换为集合并可以找到常见对象,例如

l1_set = set(tuple(row) for row in l1)
l2_set = set(tuple(row) for row in l2)
l3_set = set(tuple(row) for row in l3)

print (ipl_set & vgda_set & odm_set)

set([('a', 'b')])

我不确定如何管理集合,因此我可以找到不同的值并修改列表以包括这些不同的值,同时保持列表中的位置。

顺序很重要。我不想简单地添加缺少的列表项,例如:

l1 = [['a', 'b'],['e','f'],['c','-']
l2 = [['a', 'b'],['c','d'],['e','-']
l3 = [['a', 'b'],['c','d'],['e','-']

2 个答案:

答案 0 :(得分:1)

函数add_missing_items()接受任意数量(>0)的列表,并向其添加其他列表中缺少的项目。假设列表中的项目可以按字母顺序排序:

l1 = [['a', 'b'],['e','f']]
l2 = [['a', 'b'],['c', 'd']]
l3 = [['a', 'b'],['c', 'd']]

def add_missing_items(*lists):
    l_sets = [set(tuple(row) for row in l) for l in lists]
    u = l_sets[0].union(*l_sets[1:])

    for lst, slst in zip(lists, l_sets):
        l = [list(v) for v in u.difference(slst)]
        for missing_value in l:
            missing_value[1::1] = '-' * (len(missing_value)-1)
        lst[:] = sorted(lst + l)

add_missing_items(l1, l2, l3)

print(l1)
print(l2)
print(l3)

打印:

[['a', 'b'], ['c', '-'], ['e', 'f']]
[['a', 'b'], ['c', 'd'], ['e', '-']]
[['a', 'b'], ['c', 'd'], ['e', '-']]

答案 1 :(得分:0)

您可以测试列表中的一对是否在另一个列表中,例如:

l1 = [['a', 'b'],['e','f']]
l2 = [['a', 'b'],['c', 'd']]
l3 = [['a', 'b'],['c', 'd']]

for couple in l1:
    if couple not in l2:
        print(couple)

在上述情况下,这只是一个示例,显示了如何查找与l1不同的元素。但是,您可以对数组进行图像修改,而不仅仅是打印。

因此,如果要修改数组,建议您复制它们,而不要直接修改原始数组。