如何通过比较两个列表将缺少的元素添加到第二个列表

时间:2019-07-02 13:24:38

标签: python

我有两个包含按日期排列的数据的列表,并且想通过与 list1

进行比较在 list2 中添加日期的缺失数据

列表如下

 list1=['2019-06-01', '2019-06-02', '2019-06-03', '2019-06-04', '2019-06-05']
 list2=[['2019-06-01','3'], ['2019-06-02','0'],['2019-06-04','1'], ['2019-06-05', '4']]

列表2 中的此处不包含 2019-06-03 的数据,因此要将该日期丢失的数据添加到列表2 包含空值且最终值为 list2 的内容如下

list2=[['2019-06-01','3'], ['2019-06-02','0'],['2019-06-03','']['2019-06-04','1'], ['2019-06-05', '4']]

以下是我尝试使用的代码,用于将缺少的值添加到另一个列表中

 for a, b in itertools.izip_longest(list1,list2):
     if a!=b[0]:
         print a

如下所示打印

  2019-06-03
  2019-06-04
  2019-06-05

有人可以在这里引导我吗

9 个答案:

答案 0 :(得分:4)

这是使用itertools.chainset的一种方法

例如:

from itertools import chain

list1=['2019-06-01', '2019-06-02', '2019-06-03', '2019-06-04', '2019-06-05']
list2=[['2019-06-01','3'], ['2019-06-02','0'],['2019-06-04','1'], ['2019-06-05', '4']]

check_val = set(chain.from_iterable(list2))

for i in list1:
    if i not in check_val:
        list2.append([i, ""])
print(list2)
print(sorted(list2, key=lambda x: x[0]))

输出:

[['2019-06-01', '3'], ['2019-06-02', '0'], ['2019-06-04', '1'], ['2019-06-05', '4'], ['2019-06-03', '']]
[['2019-06-01', '3'], ['2019-06-02', '0'], ['2019-06-03', ''], ['2019-06-04', '1'], ['2019-06-05', '4']]

答案 1 :(得分:4)

dates_in_list2 = [x[0] for x in list2]
missing_data = [[x, ''] for x in list1 if x not in dates_in_list2]
list2.extend(missing_data)

答案 2 :(得分:3)

您可以使用set来找到set.difference并从结果中添加一个新的子列表:

list2 += [list(set(list1).difference([i[0] for i in list2])) + ['']]

print(list2)

[['2019-06-01', '3'],
 ['2019-06-02', '0'],
 ['2019-06-04', '1'],
 ['2019-06-05', '4'],
 ['2019-06-03', '']]

答案 3 :(得分:3)

为什么0理解中不包含生成器表达式:

list

输出:

print([next((x for x in list2 if v in x), [v, '']) for i, v in enumerate(list1)])

它会自动保持订单正确。

答案 4 :(得分:3)

您可以使用差异设置来查找缺少的日期,然后将其添加到list2(并按日期对它进行排序...)。

尝试一下:

list1 = ['2019-06-01', '2019-06-02', '2019-06-03', '2019-06-04', '2019-06-05']
list2 = [['2019-06-01', '3'], ['2019-06-02', '0'], ['2019-06-04', '1'], ['2019-06-05', '4']]

set1 = {*list1}
set2 = {t[0] for t in list2}

diff = set1 - set2

for date in diff:
    list2.append([date, ''])

list2.sort(key=lambda t: t[0])
print(list2)

输出:

[['2019-06-01', '3'], ['2019-06-02', '0'], ['2019-06-03', ''], ['2019-06-04', '1'], ['2019-06-05', '4']]

答案 5 :(得分:2)

您需要为[['2019-06-01', '3'], ['2019-06-02', '0'], ['2019-06-03', ''], ['2019-06-04', '1'], ['2019-06-05', '4']] 中的每个元素迭代list1并查看是否存在匹配的元素。考虑到您的列表很小,这不应该是性能问题。如果您知道您的列表已排序,则可以进行一些优化,但现在可能已经过头了。

答案 6 :(得分:2)

单个管道中的另一个set差异:

list2.extend([i, ''] for i in set(list1) - set(d[0] for d in list2))
list2.sort()
print(list2)

输出:

[['2019-06-01', '3'], ['2019-06-02', '0'], ['2019-06-03', ''], ['2019-06-04', '1'], ['2019-06-05', '4']]

答案 7 :(得分:2)

我将使用numpy setdiff1d函数,然后将每个项目附加到list2。

import numpy as np
list1=['2019-06-01', '2019-06-02', '2019-06-03', '2019-06-04', '2019-06-05']
list2=[['2019-06-01','3'], ['2019-06-02','0'],['2019-06-04','1'], ['2019-06-05', '4']]
diff=np.setdiff1d(list1, [b[0] for b in list2])
for i in diff:
    list2.append([i,''])
list2.sort()
Result:
[['2019-06-01', '3'],
 ['2019-06-02', '0'],
 ['2019-06-04', '1'],
 ['2019-06-05', '4'],
 ['2019-06-03', '']]

答案 8 :(得分:2)

您可以使用字典构造函数来实现。因为构造函数会覆盖重复键的值,所以您可以为它提供两个列表,并让list2优先于list1(具有默认值):

result = sorted(dict((a[0],a[1:] or ["x"]) for a in list1+list2).values(),key=tuple)

注意:仅在需要保留订单时才需要使用sorted()

如果list1始终包含所有可能的日期,则可以使用list2数据字典作为默认值的替代:

result = [[d,v.get(d,"x")] for v in [dict(list2)] for d in list1]

注意:这可以保留顺序,并且比其他方法要快,但是要求list1的日期是list2的超集