python - 通过比较python中的两个嵌套列表生成0和1的嵌套列表
问题描述
我有两个嵌套列表,如下所示:
list_x = [[21, 58, 68, 220, 266, 386, 408, 505, 518, 579],
[283, 286, 291, 321, 323, 372, 378, 484, 586, 629]]
list_y = [[21, 220, 386, 505, 518], [286, 291, 321, 323, 372]]
我想比较上面嵌套列表中相同索引位置的元素,意思list_x[0]
应该是比较list_y[0]
等等。
我想生成第三个(嵌套)列表,这样对于 中的每个数字list_x[0]
,如果该数字也在 中list_y[0]
,则生成一个,如果没有匹配项,则生成一个零。应该为list_x[1]
和执行相同的过程list_y[1]
。
我的嵌套输出列表中每个子列表的长度应为 10(即较长的子列表的长度,匹配时为 1,不匹配时为 0)。所有子列表按升序排序。
一些值得分享的额外信息是和分别是list_y[0]
和list_y[1]
的子集。list_x[0]
list_x[1]
因此,我正在寻找的输出列表应如下所示:
out = [[1,0,0,1,0,1,0,1,1,0], [0,1,1,1,1,1,0,0,0,0]]
我尝试了以下代码,但我得到了 10 个额外的零
list_x = [y for x in list_x for y in x] #to flatten list_x
result = []
for y in list_y:
sublist = []
for x in list_x:
if x in y:
sublist.append(1)
else:
sublist.append(0)
result.append(sublist)
上面的代码给了我以下信息:
result = [[1, 0, 0, 1, 0, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0]]
谢谢,如果你能帮忙!
解决方案
我们可以使用zip
同时迭代子列表,然后执行in
检查,例如:
[[int(x in suby) for x in subx] for subx, suby in zip(list_x, map(set, list_y))]
然后产生:
>>> [[int(x in suby) for x in subx] for subx, suby in zip(list_x, list_y)]
[[1, 0, 0, 1, 0, 1, 0, 1, 1, 0], [0, 1, 1, 1, 1, 1, 0, 0, 0, 0]]
map(set, list_y)
用于映射 in 集合的所有子列表,list_y
因为查找集合通常会在O(1)中运行,而在列表中查找则需要O(n)。
推荐阅读
- reactjs - 如何确保刷新页面后状态立即更新?
- python - 删除括号是删除逗号后的所有内容 - str.get
- testing - 如何在 Testcafe 中启用登录
- laravel - Laravel 8 Model函数获取字段名称
- html - Safari 图像不显示
- html - 如何在浮动div中垂直居中图像
- ios - 具有比例和 alpha 的 UIView 弹簧动画
- asp.net - 如何将 Android Flutter 应用程序和 asp.net 站点与 sql server 数据库连接起来
- batch-file - 使用 WinSCP 从名称为会计年度的文件夹上传到 SFTP 服务器
- laravel - Laravel Blade:如何访问与当前语言环境不同的语言环境的字符串翻译?