我有两个包含按日期排列的数据的列表,并且想通过与 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
有人可以在这里引导我吗
答案 0 :(得分:4)
这是使用itertools.chain
和set
的一种方法
例如:
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的超集