回答此问题可获得 20 贡献值,回答如果被采纳可获得 50 分。
<p>我编写了一个小python程序来迭代数据文件(<em>input_file</em>)并执行计算。如果计算结果达到某些状态(<em>stateA</em>或<em>stateB</em>),则从结果中提取信息(<em>点击</em>)。要提取的命中取决于三个参数集中的参数。<br/>
我使用字典来存储我的参数集(<em>param_sets</em>)和列表字典来存储命中率(<em>hits</em>)。字典<em>param_sets</em>和<em>点击</em>具有相同的键。在</p>
<p>问题是</p>
<p>在<em>hits</em>字典中的列表是以某种方式耦合的。当一个列表更改时(通过调用<em>extract_hits</em>函数),其他列表也会更改。在</p>
<p>这里是(简称)代码:</p>
<pre><code>import os, sys, csv, pdb
from operator import itemgetter
# define three parameter sets
param_sets = {
'A' : {'MIN_LEN' : 8, 'MAX_X' : 0, 'MAX_Z' : 0},
'B' : {'MIN_LEN' : 8, 'MAX_X' : 1, 'MAX_Z' : 5},
'C' : {'MIN_LEN' : 9, 'MAX_X' : 1, 'MAX_Z' : 5}}
# to store hits corresponding to each parameter set
hits = dict.fromkeys(param_sets, [])
# calculations
result = []
for input_values in input_file:
# do some calculations
result = do_some_calculations(result, input_values)
if result == stateA:
for key in param_sets.keys():
hits[key] = extract_hits(key, result,
hits[key],
param_sets[key]['MIN_LEN'],
param_sets[key]['MAX_X'],
param_sets[key]['MAX_Z'])
result = [] # discard results, start empty result list
elif result == stateB:
for key in param_sets.keys():
local_heli[key] = extract_hits(key,
result,
hits[key],
param_sets[key]['MIN_LEN'],
param_sets[key]['MAX_X'],
param_sets[key]['MAX_Z'])
result = [] # discard results
result = some_calculation(input_values) # start new result list
else:
result = some_other_calculation(result) # <a href="https://www.cnpython.com/list/append" class="inner-link">append</a> result list
def extract_hits(k, seq, hits, min_len, max_au, max_gu):
max_len = len(seq)
for sub_seq_size in reversed(range(min_len, max_len+1)):
for start_pos in range(0,(max_len-sub_seq_size+1)):
from_inc = start_pos
to_exc = start_pos + sub_seq_size
sub_seq = seq[from_inc:to_exc]
# complete information about helical fragment sub_seq
helical_fragment = get_helix_data(sub_seq, max_au, max_gu)
if helical_fragment:
hits.append(helical_fragment)
# search seq regions left and right from sub_seq for further hits
left_seq = seq[0:from_inc]
right_seq = seq[to_exc:max_len]
if len(left_seq) >= min_len:
hits = sub_check_helical(left_seq, hits, min_len, max_au, max_gu)
if len(right_seq) >= min_len:
hits = sub_check_helical(right_seq, hits, min_len, max_au, max_gu)
print 'key', k # just for testing purpose
print 'new', hits # just for testing purpose
print 'frag', helical_fragment # just for testing purpose
pdb.set_trace() # just for testing purpose
return hits # appended
return hits # unchanged
</code></pre>
<p>这里是python调试器的一些输出:</p>
^{pr2}$
<p>来自键A</em>的元素不应出现在键B</em>中,键A和键B的元素不应出现在键C</em>中。在</p>