Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
通过比较python中两个不同的整数列表,生成一个0和1的列表_Python_List - Fatal编程技术网

通过比较python中两个不同的整数列表,生成一个0和1的列表

通过比较python中两个不同的整数列表,生成一个0和1的列表,python,list,Python,List,我最近开始学习Python,遇到了以下问题,我将尽力用文字解释: 我有两个不同的列表,如下所示: list_a = [1,2,3,4,5] list_b = [[2,5],[1,4]] 我想比较两个列表并生成第三个列表,这样对于列表_b中每个列表中的每个数字,如果数字等于列表_a中相应的数字,则生成一个1,如果没有匹配,则生成零 我的输出列表中的每个列表的长度应等于列表的长度(即长度为5,有匹配项时为1,没有匹配项时为0) 因此,我正在寻找的输出列表应如下所示: out

我最近开始学习Python,遇到了以下问题,我将尽力用文字解释:

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

    list_a = [1,2,3,4,5]
    list_b = [[2,5],[1,4]]
我想比较两个列表并生成第三个列表,这样对于列表_b中每个列表中的每个数字,如果数字等于列表_a中相应的数字,则生成一个1,如果没有匹配,则生成零

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

因此,我正在寻找的输出列表应如下所示:

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

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

使用嵌套列表理解

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

列表理解中的多个循环可能会让阅读变得有点混乱,因此为了可读性,更容易写出循环:

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)

您可以为
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
现在,在
列表b
中的这些短子列表中,函数
SpghttCd
Tyger
的迭代次数远少于
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)

第一个问题,列表a是否可以采用
[2,5,3,1,4]
的形式?第二个问题,列表a是否可以采用
[12,123,696,1,84393]的形式
还是必须是以1开头的连续数字?请用您尝试过的代码更新您的问题。@LazyCoder您刚才提到的两个列表在形式上有什么不同?我试图了解列表a和列表b之间是否存在依赖关系,或者@GThomas正在尝试将数字矢量化不经意间。
int(列表中的el)
。您能否利用输出的最终值与列表a无关这一事实?当然,最终值与列表a有关,因为我检查列表a的每个值是否都在嵌套列表b的列表元素中。检查这部分
[int(列表中的el)查看列表中的el]
我做了类似的操作,但可能更容易阅读
答案=[[1 if x in y,否则0 for x in list_a]for y in list_b]
由于@chepner注释,我在改编之前也使用了它。我认为这更容易阅读,在python中也很常见。@Akaisteph7感谢您的建议,这是否更好?对于如此简单的代码,注释是不必要的。不过,关于你为什么认为这是一个好答案的描述还是不错的。
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)