在两个反转列表的方法之间获得不一致的输出

时间:2016-04-14 09:09:48

标签: python python-2.7 nested-lists experimental-design

我正在尝试运行一个平衡计划。我无法理解Python正在做什么来获得我收到的输出。我有16个地图的8个变种。变体由timingConditions * distractionConditions定义。初始变量定义有4个关键部分:

  1. inst是一个包含所有8个变体* 16个实验地图的列表 按变体排序(地图就像一个视频游戏地图)。这留下了len(inst) = 128
  2. inst细分为conds中的8个子列表。每一个 子列表表示特定变体的地图1-16。每个指数 在子列表中代表一个地图/变体组合。在conds中调用每个子列表的索引将清楚地显示这一点。
  3. 16个地图分为8个列表,每个列表包含两个映射,每个映射在变量MapGroups中定义。这8个列表用于下面的矩阵。

  4. counterBalanceMatrix表示八种独特的平衡排序,用于条件赋值。 range(1,9)中的每个主题都分配给其中一行。行中的数字表示地图组。列(即索引排序)表示变量到映射组的分配。例如,counterBalanceMatrix[0][0]返回1,第一个索引对应于第一个变体列SSTrue的赋值;第二个索引对应MapGroups[0](返回'0','15')。因此,期望的输出将是映射0和15(或1和16而没有基于零的排序)被分配SS-True。你可以按如下方式想象:

            ####+--------+--------+--------+--------+---------+---------+---------+---------+
            ####| SSTrue | SLTrue | LSTrue | LLTrue | SSFalse | SLFalse | LSFalse | LLFalse |
            ####+--------+--------+--------+--------+---------+---------+---------+---------+
            ####|      1 |      2 |      3 |      4 |       5 |       6 |       7 |       8 |
            ####|      2 |      3 |      4 |      5 |       6 |       7 |       8 |       1 |
            ####|      3 |      4 |      5 |      6 |       7 |       8 |       1 |       2 |
            ####|      4 |      5 |      6 |      7 |       8 |       1 |       2 |       3 |
            ####|      5 |      6 |      7 |      8 |       1 |       2 |       3 |       4 |
            ####|      6 |      7 |      8 |      1 |       2 |       3 |       4 |       5 |
            ####|      7 |      8 |      1 |      2 |       3 |       4 |       5 |       6 |
            ####|      8 |      1 |      2 |      3 |       4 |       5 |       6 |       7 |
            ####+--------+--------+--------+--------+---------+---------+---------+-----  ----+
    
  5. 代码的预期输出低于subject in range(1,9):的预期输出,每个MapGroup将有一个实例,每个变量有两个观察值(例如SS-TRUE,LL-False等)。在所有科目中,所有MapGroups和变体都会有相同的观察结果。 此部分代码按预期工作

    import re
    timingConditions = ["SS","SL","LS","LL"]
    distractionConditions = ["True","False"]
    maps = [i for i in range(1,17)]
    
    #This loop sets up the 128 (16*8) variants. Inst for instances of scenario.
    inst = []
    for d in distractionConditions:
        for t in timingConditions:
            for map in maps:
                inst.append(str(str(map)+"-"+t+"-"+d))
    
    conds = [inst[0:16],inst[16:32],inst[32:48],inst[48:64],inst[64:80],inst[80:96],inst[96:112],inst[112:128]]
    
    MapGroups= [[0,8],
    [1,9],
    [2,10],
    [3,11],
    [4,12],
    [5,13],
    [6,14],
    [7,15]]
    
    counterBalanceMatrix= [[1,2,3,4,5,6,7,8],
    [2,3,4,5,6,7,8,1],
    [3,4,5,6,7,8,1,2],
    [4,5,6,7,8,1,2,3],
    [5,6,7,8,1,2,3,4],
    [6,7,8,1,2,3,4,5],
    [7,8,1,2,3,4,5,6],
    [8,1,2,3,4,5,6,7]]
    
    for subject in range(1,9):
        cRow = counterBalanceMatrix[(subject-1)%8]#Use the modulus operator to find out which row to use in counterbalancing for this subject.
        scenArray = []
    
        for group in range(0,8):#This loops across map groups and look up their assigned interruption condition
            scenArray.extend([conds[cRow[group]-1][i] for i in MapGroups[group]]) 
            print "****","Participant",subject,"Correct Day 1****"
            print scenArray
            print "\n\n"
    

    这就是问题所在: 我想重复这个过程,但是镜像了。也就是说,无论最初为每个list in MapGroups分配的变体,我希望它被反转(例如,如果您收到MapGroups[0]为True,那么我希望它们为假。MapGroups[0]被指定为SS ,现在必须是LL。

    我的初步解决方案是反转counterBalanceMatrix并应用相同的循环。然而,这不起作用:

    counterBalanceMatrixReverse= []
    for list in counterBalanceMatrix:
        counterBalanceMatrixReverse.append(list[::-1])
    
    ###And then run the exact same loop over.
    for subject in range(1,9):
        cRow = counterBalanceMatrixReverse[(subject-1)%8]
    #
        scenArray = []
        for group in range(0,8):
            scenArray.extend([conds[cRow[group]-1][i] for i in MapGroups[group]])
            print "****","Participant",subject,"Broken Reversed 2****"
            print scenArray
            print "\n\n" 
    

    输出不正确,例如:

    >Participant 4 
    >'2-SL-True', '10-SL-True'
    Participant 4 Reversed
    >'2-SS-False', '10-SS-False'
    Exptected Reversed Ouput:
    >'2-LS-False', '10-LS-False'
    

    然而,简单地反转cond数组确实解决了我的问题

    condsreverse = []
    condsreverse.extend(conds[::-1])
    
    for subject in range(1,9):
        cRow = counterBalanceMatrix[(subject-1)%8]#Note I use same matrix
        scenArray = []
        for group in range(0,8):
            scenArray.extend([condsreverse[cRow[group]-1][i] for i in MapGroups[group]]) 
        print "****","Subject",subject,"Correct Reverse****"
        print scenArray
        print "\n\n"
    

    我现在已经坐了三天了,我无法理解为什么最初的反转解决方案无法产生所需的输出。

1 个答案:

答案 0 :(得分:1)

我认为解决方案如下,只是为了结束问题。

我的错误是我假设[conds[cRow[group]-1]根据cRow[i]的索引分配了变体,而cRow[i]只是用来调用特定的地图。但是,实际上正在做的是根据cRow[i]的值分配变体。因此,"列"没有根据索引分配给MapGroups。这意味着简单地反转counterBalanceMatrix基本上只是创建counterBalanceMatrix的另一个版本。

我能够获得相互镜像条件的唯一方法是颠倒conds的顺序,因为这是实际在分配中使用的列表;除非我当然想要更改scenArray.extend([condsreverse[cRow[group]-1][i] for i in MapGroups[group]])来调用每个项目的索引(对于原始项目和反向项目),然后根据该索引调用地图组,如下所示:

for index in range(0,8):
    scenArray.extend([conds[index][i] for i in MapGroups[cRow[index]-1]])

PS:我想把它写出来作为一个问题让我意识到自己的错。对不起。