2015-10-29 118 views
1

我一直在用Python(2.7)堆棧問題幾天。我有2個數據集,A和B,來自2個不同的羣體,其中包含染色體上的有序位置(通過名稱定義,例如rs4957684)及其在2個羣體中的相應頻率。 B中的大部分位置與A中的位置相匹配。我需要僅在A和B之間獲得A和B中的頻率,並且沿着染色體以相應的順序獲得。迭代包含字典中鍵的列。從第二個字典返回匹配的鍵從第一個字典中保存鍵的順序

我創建了一個帶有4列的csv文件(df.csv):來自A(c1)的鍵,來自A(c2)的值,來自B(c3)的鍵,來自B(c4)的值。

首先,我用A和B的鍵和值(分別爲位置和頻率)創建了2個字符dA和dB,並查找A和B之間匹配的鍵。從匹配的鍵生成2個新字符對於A和B(dA2和dB2)。 的問題是,因爲它們類型的字典,我不能在染色體匹配的位置的順序,所以我想通了另一種策略:

沿C1迭代,並看到C3任何鍵是否有序鍵匹配C1 。如果是,則返回具有匹配鍵的值(A和B)的有序列表。

我寫了這個代碼:

import csv 
from collections import OrderedDict 

with open('df.csv', mode='r') as infile: # input file 
# to open the file in universal-newline mode 
reader = csv.reader(open('df.csv', 'rU'), quotechar='"', delimiter = ',') 
dA= dict((rows[1],rows[2]) for rows in reader) 
dB= dict((rows[3],rows[4]) for rows in reader) 

import sys 
sys.stdout = open("df2.csv", "w") 

for key, value in dB: 
    if rows[3] in dA.key(): 
     print rows[2], rows[4] 

這裏腳本似乎運行,但我沒有得到任何輸出

# I also tried this: 
for row in reader: 
    if row[3] in dA.key(): 
     print row[4] 

...和我有同樣的問題。

+0

爲什麼不使用OrderedDict? –

+0

另外請注意,您不能像這樣迭代字典:'對於鍵值,以dB爲單位,如果需要鍵和值,則應該調用'iteritems'方法。 –

回答

1

正如我所看到的,您導入了OrderedDict,但沒有使用它。您應該構建OrderedDict以節省按鍵順序:

dict_a = OrderedDict((rows[1],rows[2]) for rows in reader) 
dict_b = dict((rows[3],rows[4]) for rows in reader) 

for key, value in dict_a.iteritems(): 
    if dict_b[key] == value: 
     print value 
+0

非常感謝@Eugene Soldatov !!。它效果很好! – Lucas

相關問題