我有两个日期列表。如果存在日期,我想生成一个输出,如果没有,则生成另一个输出。我的代码是:
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) ==> 1
和 int(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]
这是假设所有日期的格式相同,字符串比较是比较它们的有效方法。转换为日期进行比较可能更可靠。