我有两个日期列表。如果要显示一个日期,我想产生一个输出,如果不存在,则想要另一个。我的代码是:
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)]
我知道这是错误的,而且效率不高。我想知道是否有数据框方法或其他有效方法?
答案 0 :(得分:1)
以您的情况
list(map(int,[x in result_list for x in main_list]))
[1, 0, 1, 1, 0, 0, 1]
答案 1 :(得分:1)
您可以使用list comprehension
在main_list
上循环,并检查result_list
中是否存在每个元素
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]
答案 2 :(得分: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]
答案 3 :(得分:0)
简单的列表理解(避免进入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
)。
答案 4 :(得分: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]
这是假设所有日期都采用相同的格式,并且字符串比较是比较它们的有效方法。转换为比较日期可能会更可靠。