在python中创建虚拟变量的有效方法

时间:2016-03-22 14:36:20

标签: python

我想创建一个虚拟变量向量(只能带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
  • 循环(来自我的例子):2.11秒
  • 列表理解:1.55秒
  • list comprehension(变量是set的类型):0.0004992 sec
  • 彼得的例子:0.0004999秒
  • 来自falsetrue的示例:0.000502 sec

2 个答案:

答案 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,则查找速度会更快。

您还可以将布尔值转换为整数,以获得set1 0True

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)
  • 您可以使用int(bool)来获得1或0.(而不是条件表达式)
>>> data = ['one','two','three','four','six']
>>> variables = ['two','five','ten']
>>> xs = set(data)
>>> [int(x in xs) for x in variables]
[1, 0, 0]