如果某个项目存在于一个列表中,而不是另一个列表中,则生成一些输出



我有两个日期列表。如果存在日期,我想生成一个输出,如果没有,则生成另一个输出。我的代码是:

main_list = ['2019-01-24', '2019-01-25', '2019-01-26', '2019-01-27', '2019-01-28', '2019-01-29', '2019-01-30']
result_list = ['2019-01-24', '2019-01-26', '2019-01-27', '2019-01-30']

我想基于上述两个列表生成一个输出列表。我想在result_list中是否存在main_list日期1输出,如果没有,0

我的预期输出是:

output_list = [1,0,1,1,0,0,1]

我的代码是:

output_list = [if (i=j) 1 for i,j in zip(met4_gooddays,alldates)]

我知道这是错误的,这是低效的方法。我想知道是否有数据帧方法或其他有效的方法?

您可以使用

循环main_list并检查result_list中是否存在每个元素list comprehension

main_list = ['2019-01-24', '2019-01-25', '2019-01-26', '2019-01-27', '2019-01-28', '2019-01-29', '2019-01-30']
result_list = ['2019-01-24', '2019-01-26', '2019-01-27', '2019-01-30']
output_list = [1 if i in result_list else 0 for i in main_list ]
# [1, 0, 1, 1, 0, 0, 1]

在您的情况下

list(map(int,[x in result_list for x in main_list]))
[1, 0, 1, 1, 0, 0, 1]

首先,在循环内执行成员资格检查时使用集合,这可以确保您的代码以线性时间而不是二次时间运行。

有了这个,让我们尝试一些功能map

s = set(result_list) 
list(map(s.__contains__, main_list))                                                                                   
# [True, False, True, True, False, False, True]
# if you want a list of 0s and 1s
list(map(int, map(s.__contains__, main_list)))                                                                         
# [1, 0, 1, 1, 0, 0, 1]

在列表理解形式中,这将是

[int(d in s) for d in main_list]
# [1, 0, 1, 1, 0, 0, 1]
一个简单的

列表理解(以避免转到map并返回list(:

output_list = [int(i in result_list) for i in main_list]
print(output_list)

输出:

[1, 0, 1, 1, 0, 0, 1]

它检查main_list中的每个元素是否存在于result_list中(当然是 int(True) ==> 1int(False) ==> 0 (。

result_list变成一个set,以便在理解中更快地查找。

>>> rset = set(result_list)
>>> [1 if m in rset else 0 for m in main_list]
[1, 0, 1, 1, 0, 0, 1]

并不是说这么小的投入很重要,但原则上它更有效率。

另一种方式,有些人可能会认为更干净

>>> [int(m in rset) for m in main_list]
[1, 0, 1, 1, 0, 0, 1]

这是假设所有日期的格式相同,字符串比较是比较它们的有效方法。转换为日期进行比较可能更可靠。

最新更新