通过比较python中两个不同的整数列表,生成一个0和1的列表
我最近开始学习Python,遇到了以下问题,我将尽力用文字解释: 我有两个不同的列表,如下所示:通过比较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
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)