我将数据存储在如下组织的列表列表中:
lst = [
['FHControl', G, A]
['MNHDosed', G, C]
]
对于lst:row [0]中的行,总共有12个类别(我在上面的示例代码中列出了两个类别)。对于行[1]和行[2],我只关注这些字母的6个组合。因此,我在lst中每行有72种可能的数据组合,需要计算每个组合的实例,而不必编写几十个嵌套的if循环。
我正在尝试创建两个函数来解析这些列表并对这72个组合的发生率进行分析。我怎样才能使用两个函数,比如我下面开始编写的更新这些变量的函数?我是否需要将字典构造为类变量,以便在迭代这两个函数时可以继续更新它们?任何指导都会很棒!
这是我目前将所有72个变量初始化为6个字典的代码(对于行[1]和行[2]中的6个字母组合):
def baseparser(lst):
TEMP = dict.fromkeys('FHDosed FHControl FNHDosed FNHControl '
'FTDosed FTControl MHDosed MHControl '
'MNHDosed MNHControl MTDosed MTControl'.split(), 0)
TRI_1, TRI_2, TRV_1, TRV_2, TRV_3, TRV_4 = ([dict(TEMP) for i in range(6)])
for row in lst:
if row[0] == 'FHDosed':
binner(row[0], row[1], row[2])
if row[0] == 'FHControl':
binner(row[0], row[1], row[2])
etc.
def binner(key, q, s):
if (q == 'G' and s == 'A') or (q =='C' and s =='T'):
TRI_1[key] += 1
elif (q == 'A' and s == 'G') or (q =='T' and s =='C'):
TRI_2[key] += 1
elif (q == 'G' and s == 'T') or (q =='C' and s =='A'):
TRV_1[key] += 1
elif (q == 'G' and s == 'C') or (q =='C' and s =='G'):
TRV_1[key] += 1
elif (q == 'A' and s == 'T') or (q =='T' and s =='A'):
TRV_1[key] += 1
elif (q == 'A' and s == 'C') or (q =='T' and s =='G'):
TRV_1[key] += 1
答案 0 :(得分:4)
您的代码可以简化为:
TEMP = dict.fromkeys('''FHDosed FHControl FNHDosed FNHControl FTDosed FTControl MHDosed
MHControl MNHDosed MNHControl MTDosed MTControl'''.split(), 0)
TRI_1, TRI_2, TRV_1, TRV_2, TRV_3, TRV_4 = [TEMP.copy() for i in range(6)]
dmap = {
('G', 'A'): TRI_1,
('C', 'T'): TRI_1,
('A', 'G'): TRI_2,
('T', 'C'): TRI_2,
('G', 'C'): TRV_1,
('C', 'G'): TRV_1,
('A', 'T'): TRV_1,
('T', 'A'): TRV_1,
}
for row in lst:
key, q, s = row
dmap[q, s][key] += 1
另一种可能性是使用一个dicts字典而不是6个dicts:
TEMP = dict.fromkeys('''FHDosed FHControl FNHDosed FNHControl FTDosed FTControl MHDosed
MHControl MNHDosed MNHControl MTDosed MTControl'''.split(), 0)
TR = {key:TEMP.copy() for key in ('TRI_1', 'TRI_2', 'TRV_1', 'TRV_2', 'TRV_3', 'TRV_4')}
dmap = {
('G', 'A'): 'TRI_1',
('C', 'T'): 'TRI_1',
('A', 'G'): 'TRI_2',
('T', 'C'): 'TRI_2',
('G', 'C'): 'TRV_1',
('C', 'G'): 'TRV_1',
('A', 'T'): 'TRV_1',
('T', 'A'): 'TRV_1',
}
lst = [
['FHControl', 'G', 'A'],
['MNHDosed', 'G', 'C']
]
for row in lst:
key, q, s = row
TR[dmap[q, s]][key] += 1
print(TR)
这样做的好处是你的命名空间中的dicts更少,并且稍后使用dicts的dict而不是硬编码6 dicts来重构代码可能更容易。
跟进Midnighter的建议,如果你有pandas,你可以用一个DataFrame替换dicts的dict。然后可以使用pd.crosstabs计算对的频率,如下所示:
import pandas as pd
dmap = {
'GA': 'TRI_1',
'CT': 'TRI_1',
'AG': 'TRI_2',
'TC': 'TRI_2',
'GC': 'TRV_1',
'CG': 'TRV_1',
'AT': 'TRV_1',
'TA': 'TRV_1',
}
lst = [
['FHControl', 'G', 'A'],
['MNHDosed', 'G', 'C']
]
df = pd.DataFrame(lst, columns=['key', 'q', 's'])
df['tr'] = (df['q']+df['s']).map(dmap)
print(df)
# key q s tr
# 0 FHControl G A TRI_1
# 1 MNHDosed G C TRV_1
print(pd.crosstab(rows=[df['key']], cols=[df['tr']]))
产量
tr TRI_1 TRV_1
key
FHControl 1 0
MNHDosed 0 1