如果一个项目存在于一个列表中而不是其他列表中,则产生一些输出

时间:2019-06-08 00:30:31

标签: python

我有两个日期列表。如果要显示一个日期,我想产生一个输出,如果不存在,则想要另一个。我的代码是:

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)]

我知道这是错误的,而且效率不高。我想知道是否有数据框方法或其他有效方法?

5 个答案:

答案 0 :(得分:1)

以您的情况

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

答案 1 :(得分:1)

您可以使用list comprehensionmain_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) ==> 1int(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]

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