我一直在用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]
...和我有同樣的問題。
爲什麼不使用OrderedDict? –
另外請注意,您不能像這樣迭代字典:'對於鍵值,以dB爲單位,如果需要鍵和值,則應該調用'iteritems'方法。 –