2017-05-22 2 views
0

目的は、それぞれが同じ行エントリを含む2つの列間の違いを、異なる行に見ることです。Python:2つの列の間で同じ行エントリのシフトを示す出力を作成する

[ 
["ENSCAFG00000008901","ENSCAFG00000013762"], 
["ENSCAFG00000029470","ENSCAFG00000003029"], 
["ENSCAFG00000013782","ENSCAFG00000007249"], 
["ENSCAFG00000000806","ENSCAFG00000012468"], 
["ENSCAFG00000013341","ENSCAFG00000018167"], 
["ENSCAFG00000003376","ENSCAFG00000003376"], 
["ENSCAFG00000000812","ENSCAFG00000018164"], 
["ENSCAFG00000012468","ENSCAFG00000001591"], 
["ENSCAFG00000031786","ENSCAFG00000013782"], 
["ENSCAFG00000000803","ENSCAFG00000030793"], 
["ENSCAFG00000003029","ENSCAFG00000015177"], 
["ENSCAFG00000011565","ENSCAFG00000005750"] 
] 

このリストにはさらに多くの行があるため、手作業ではできません。たとえば、最初の列の11行目と2列目の2行目のENSCAFG00000003029が表示されます。私は最初の列に関連して最初の列と2番目の列の間の行のシフトを示す出力を作成したいと思います。したがって、ENSCAFG00000003029の場合、ENSCAFG00000003029が最初の列に表示される行の後に+9(またはそのようなもの)が表示されます。

私の目標がはっきりしていることを願っており、これは質問するのに適した場所です。

答えて

0

私はあなたが2回ループする必要があると思います。あなたが最初の列のエントリが一意である単純化の仮定をする場合たとえば、あなたが行うことができます:

cols = [['ENSCAFG00000008901', 'ENSCAFG00000013762'], 
     ['ENSCAFG00000029470', 'ENSCAFG00000003029'], 
     ['ENSCAFG00000013782', 'ENSCAFG00000007249'], 
     ['ENSCAFG00000000806', 'ENSCAFG00000012468'], 
     ['ENSCAFG00000013341', 'ENSCAFG00000018167'], 
     ['ENSCAFG00000003376', 'ENSCAFG00000003376'], 
     ['ENSCAFG00000000812', 'ENSCAFG00000018164'], 
     ['ENSCAFG00000012468', 'ENSCAFG00000001591'], 
     ['ENSCAFG00000031786', 'ENSCAFG00000013782'], 
     ['ENSCAFG00000000803', 'ENSCAFG00000030793'], 
     ['ENSCAFG00000003029', 'ENSCAFG00000015177'], 
     ['ENSCAFG00000011565', 'ENSCAFG00000005750']] 
positions = dict((x[0], i) for i, x in enumerate(cols)) 
[positions[x[1]]-i for i, x in enumerate(cols) if x[1] in positions] 

出力:

[9, 4, 0, -6] 
0
l1 =[] 
l2 =[] 
for item in cols: 
    l1.append(item[0]) 
    l2.append(item[0]) 
for item in l1: 
    if item in l2: 
     print str(l2.index(item)) + ':' + str(item) 
1

非常にために効率的ではないだろうつまり、これはうまくいくはずです:

lst = [ 
    ["ENSCAFG00000008901","ENSCAFG00000013762"], 
    ["ENSCAFG00000029470","ENSCAFG00000003029"], 
    ["ENSCAFG00000013782","ENSCAFG00000007249"], 
    ["ENSCAFG00000000806","ENSCAFG00000012468"], 
    ["ENSCAFG00000013341","ENSCAFG00000018167"], 
    ["ENSCAFG00000003376","ENSCAFG00000003376"], 
    ["ENSCAFG00000000812","ENSCAFG00000018164"], 
    ["ENSCAFG00000012468","ENSCAFG00000001591"], 
    ["ENSCAFG00000031786","ENSCAFG00000013782"], 
    ["ENSCAFG00000000803","ENSCAFG00000030793"], 
    ["ENSCAFG00000003029","ENSCAFG00000015177"], 
    ["ENSCAFG00000011565","ENSCAFG00000005750"] 
    ] 

col_1 = [x[0] for x in lst] 
col_2 = [x[1] for x in lst] 

idx_offset = [None] * len(col_1) 
for col_1_idx, val_1 in enumerate(col_1): 
    try: 
     col_2_idx = col_2.index(val_1) 
    except ValueError: 
     continue 
    idx_offset[col_1_idx] = col_2_idx - col_1_idx 

要するに、最初の列の各値について、 2番目の列の値(存在する場合)このインデックスを取得し、最初の列の値のインデックスをそのインデックスから差し引くと、それが出力です。 2番目の列にない要素の最初の列の出力(idx_offset)はNoneになります。この場合、出力は次のようになります:

+0

これは私が望む出力ですが、これを入力すると投稿に記述する出力は得られません。さらに、それが属している行に出力を追加する簡単な方法はありますか? – Cheeseburgler

+0

上記は確かに出力を生成しません。ただし、インデックスオフセットを追加して元のリストの新しいコピーを簡単に作成することができます: 'outp = zip(col_1、col_2、idx_offset)]の(val_1、val_2、idx)の[val_1、val_2、idx] – acdr

関連する問題