我需要尽快解决这个问题,因为它将应用于一个巨大的数据集:
鉴于此主列表:
m=['abc','bcd','cde','def']
…以及此列表的参考列表:
r=[['abc','def'],['bcd','cde'],['abc','def','bcd']]
我想将r中的每个列表与主列表(m)进行比较,并生成一个新的列表列表。这个新对象将有一个1表示基于m的顺序的匹配项,0表示不匹配项。因此,新对象(列表列表)的列表长度将始终与m相同。 以下是基于上述m和r的预期:
[[1,0,0,1],[0,1,1,0],[1,1,0,1]]
因为r的第一个元素是['abc','def']
,并且有一个匹配项
对于m的第一和第四个元素,结果就是[1,0,0,1]
。你知道吗
到目前为止,我的方法是这样的(可能太慢了,缺少零):
output=[]
for i in r:
output.append([1 for x in m if x in i])
导致:
[[1, 1], [1, 1], [1, 1, 1]]
提前谢谢!你知道吗
您可以使用这样的嵌套列表:
此外,您可以使用
int(...)
缩短1 if ... else 0
,并且可以将r
的子列表转换为set
,这样单个mx in rx
的查找速度更快。你知道吗虽然
int(...)
比1 if ... else 0
短一点,但它似乎也慢一些,所以您可能不应该使用它。在重复查找之前将r
的子列表转换为set
应该可以加快较长列表的速度,但是对于非常短的示例列表,它实际上比简单的方法慢。你知道吗对于较长的列表,使用
set
会更快,正如预期的那样:一种方法使用^{} 和一个循环-
在显式循环中,它看起来像这样-
我们可以使用
dtype=bool
来提高内存和性能。你知道吗样本运行-
如果
r
的列表长度相等,我们就可以使用完全矢量化的方法。你知道吗你差点就到了。你知道吗
如果
x
在i
中,则要添加1
;如果不是,则要为m
中的每个x
添加0
。你知道吗所以脚本看起来像:
1 if x in i else 0
作为条件,for x in m
:结果与
相关问题 更多 >
编程相关推荐