我想创建一个虚拟变量向量(只能带O或1)。我正在做以下事情:
data = ['one','two','three','four','six']
variables = ['two','five','ten']
我有以下两种方式:
dummy=[]
for variable in variables:
if variable in data:
dummy.append(1)
else:
dummy.append(0)
或列表理解:
dummy = [1 if variable in data else 0 for variable in variables]
结果还可以:
>>> [1,0,0]
是否有更快的功能构建功能?如果变量是数千,它有点慢。
修改:使用time.time()
的结果:
我使用以下数据:
data = ['one','two','three','four','six']*100
variables = ['two','five','ten']*100000
答案 0 :(得分:7)
如果您将SELECT DISTINCT TO_CHAR(S.DID) DID,
TO_CHAR(S.DPERMCONTAINER) PERMCONTAINER,
S.DBARCODE,
S.DDOCTITLE,
S.XCOMMENTS,
SRM.XCATEGORYID,
S.XDIVISION,
S.DMEDIATYPE
FROM PRD64_URMSERVER.EXTITEMS S
LEFT JOIN PRD64_URMSERVER.EXTITEMSRM SRM ON S.DID = SRM.DID
WHERE S.XDIVISION IS NULL
AND UPPER(S.DMEDIATYPE) = 'BOX';
SELECT DISTINCT TO_CHAR(S.DID) DID,
TO_CHAR(S.DPERMCONTAINER) PERMCONTAINER,
S.DBARCODE,
S.DDOCTITLE,
S.XCOMMENTS,
SRM.XCATEGORYID,
S.XDIVISION,
S.DMEDIATYPE
FROM PRD64_URMSERVER.EXTITEMS S
LEFT JOIN PRD64_URMSERVER.EXTITEMSRM SRM ON S.DID = SRM.DID
WHERE UPPER(S.DMEDIATYPE) = 'FOLDER';
转换为data
,则查找速度会更快。
您还可以将布尔值转换为整数,以获得set
或1
0
或True
。
False
您可以在每个变量的数据集上调用>>> int(True)
1
,以便每次循环时保存创建集。
您可以将所有这些映射到一起:
__contains__
修改强>
就像我喜欢单行一样,我觉得使用列表理解更具可读性。
如果您在列表推导中创建dummy = list(map(int, map(set(data).__contains__, variables)))
,则会为每个set
重新创建variable
。所以我们需要两行:
search = set(data)
dummy = [int(variable in search) for variable in variables]
答案 1 :(得分:2)
set
- item in set
取O(1)/ item in list
取O(n)>>> data = ['one','two','three','four','six']
>>> variables = ['two','five','ten']
>>> xs = set(data)
>>> [int(x in xs) for x in variables]
[1, 0, 0]