通过比较python中两个不同的整数列表来生成零和一的列表

时间:2019-07-30 20:04:30

标签: python list

我最近开始使用Python并遇到以下问题,我将尽力用语言解释一下:

我有两个不同的列表,如下所示:

    list_a = [1,2,3,4,5]
    list_b = [[2,5],[1,4]]

我想比较两个列表,并生成第三个列表,以便对于list_b中每个列表中的每个数字,如果该数字等于list_a中的相应数字,则生成一个,如果不匹配,则为零。产生。

我的输出列表中每个列表的长度应等于list_a的长度(即,长度为5,如果有匹配项,则为1,如果没有匹配项,则为0)。

因此,我要搜索的输出列表如下:

    out = [[0,1,0,0,1],[1,0,0,1,0]] 

如果能帮助我,将不胜感激。谢谢!

3 个答案:

答案 0 :(得分:3)

使用嵌套列表推导

[[int(el in list_b_el) for el in list_a] for list_b_el in list_b]

结果

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

答案 1 :(得分:0)

列表理解中的多个循环可能会使读取变得有些混乱,因此出于可读性考虑,更容易将循环写出来:

result = []
for b in list_b:
    sublist = []
    for a in list_a:
        if a in b:
            sublist.append(1)
        else: 
            sublist.append(0)
    result.append(sublist)

答案 2 :(得分:0)

您可以为list_b中的每个子列表创建一个5零列表,然后仅迭代每个子列表中的数字,并使用它们作为索引将这些零切换为1

list_b = [[2,5],[1,4]]

out = []
for lb in list_b:
    out.append([0]*5)
    for idx in lb:
        out[-1][idx-1] = 1

性能
如果有人对执行速度感兴趣,请看一下时间:

def pythonic():
    [[int(el in list_b_el) for el in list_a] for list_b_el in list_b]

def Tyger():
    result = []
    for b in list_b:
        sublist = []
        for a in list_a:
            if a in b:
                sublist.append(1)
            else: 
                sublist.append(0)
        result.append(sublist)

def SpghttCd():
    out = []
    for lb in list_b:
        out.append([0]*5)
        for idx in lb:
            out[-1][idx-1] = 1
list_a = [1,2,3,4,5]
list_b = [[2,5],[1,4]]

%timeit pythonic()
%timeit Tyger()
%timeit SpghttCd()
3.03 µs ± 147 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
1.63 µs ± 10.8 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
1.02 µs ± 9.64 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

现在list_b中有这些简短的子列表,函数SpghttCdTyger的迭代次数比pythonic少得多,因此是最坏的情况:

list_a = [1,2,3,4,5]
list_b = [[1,2,3,4,5],[1,2,3,4,5]]

%timeit pythonic()
%timeit Tyger()
%timeit SpghttCd()
3.03 µs ± 56.5 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
1.8 µs ± 103 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
1.53 µs ± 13.1 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)