如何将此理解转换为 Python 中的 for 循环?
How to convert this comprehension to a for-loop in Python?
sample = [['CGG','ATT'],['GCGC','TAAA']]
base_counts = [[Counter(base) for base in sub] for sub in sample]
#Output : [[Counter({'G': 2, 'C': 1}), Counter({'T': 2, 'A': 1})], [Counter({'C': 2, 'G': 2}), Counter({'A': 3, 'T': 1})]]
base_freqs = [[{k_v[0]:k_v[1]/len(bases[i]) for i,k_v in enumerate(count.items())} for count in counts] for counts, bases in zip(base_counts, sample)]
#Output 2 [[{'C': 0.3333333333333333, 'G': 0.6666666666666666}, {'A': 0.3333333333333333, 'T': 0.6666666666666666}], [{'C': 0.5, 'G': 0.5}, {'A': 0.75, 'T': 0.25}]]
样本是输入,Output2是程序的最终输出。 base_freqs 的程序计算每对样本中 "bases"(碱基 = ATGC)的频率。输出提供了正确的答案。但是,我希望看到 for-loop 格式的代码而不是理解。
此代码最初取自发布的答案here
使用 for 循环并不容易,但它应该是这样的。
result = []
for counts, bases in zip(base_counts, sample):
some_list = []
for count in counts:
some_dict = {}
for i,k_v in enumerate(count.items()):
some_dict[k_v[0]] = k_v[1]/len(bases[i])
some_list.append(some_dict)
result.append(some_list)
是的。从外到内从左到右阅读理解的方式。为了便于阅读,让我们对其进行一些格式化:
base =[
[
{ k_v[0] : k_v[1]/len(bases[i])
for i,k_v in enumerate(count.items())
}
for count in counts
]
for counts, bases in zip(base_counts, sample)
]
等同于:
bases = []
for counts, bases in zip(base_counts, sample):
temp_list = []
for count in counts:
temp_dict = {}
for i, k_v in enumerate(count.items()):
temp_dict[k_v[0]] = k_v[1] / len(bases[i])
temp_list.append(temp_dict)
bases.append(temp_list)
从性能的角度来看,列表理解更好,因为您不会不断地创建新的列表和字典,也不会调用像 append 这样的方法,这会产生一些开销。
你总是可以翻译一个列表理解,例如
ls = [<EXPR> for <VARS> in <ITERABLE> if <CONDITIONAL>]
到
ls = []
for <VARS> in <ITERABLE>:
if <CONDITIONAL>:
ls.append(<EXPR>)
理解中的多个for
子句对应翻译中的嵌套for
循环,最左边的for
子句对应最外层的for
循环。
生成器、字典和集合理解的翻译是类似的。
sample = [['CGG','ATT'],['GCGC','TAAA']]
base_counts = [[Counter(base) for base in sub] for sub in sample]
#Output : [[Counter({'G': 2, 'C': 1}), Counter({'T': 2, 'A': 1})], [Counter({'C': 2, 'G': 2}), Counter({'A': 3, 'T': 1})]]
base_freqs = [[{k_v[0]:k_v[1]/len(bases[i]) for i,k_v in enumerate(count.items())} for count in counts] for counts, bases in zip(base_counts, sample)]
#Output 2 [[{'C': 0.3333333333333333, 'G': 0.6666666666666666}, {'A': 0.3333333333333333, 'T': 0.6666666666666666}], [{'C': 0.5, 'G': 0.5}, {'A': 0.75, 'T': 0.25}]]
样本是输入,Output2是程序的最终输出。 base_freqs 的程序计算每对样本中 "bases"(碱基 = ATGC)的频率。输出提供了正确的答案。但是,我希望看到 for-loop 格式的代码而不是理解。
此代码最初取自发布的答案here
使用 for 循环并不容易,但它应该是这样的。
result = []
for counts, bases in zip(base_counts, sample):
some_list = []
for count in counts:
some_dict = {}
for i,k_v in enumerate(count.items()):
some_dict[k_v[0]] = k_v[1]/len(bases[i])
some_list.append(some_dict)
result.append(some_list)
是的。从外到内从左到右阅读理解的方式。为了便于阅读,让我们对其进行一些格式化:
base =[
[
{ k_v[0] : k_v[1]/len(bases[i])
for i,k_v in enumerate(count.items())
}
for count in counts
]
for counts, bases in zip(base_counts, sample)
]
等同于:
bases = []
for counts, bases in zip(base_counts, sample):
temp_list = []
for count in counts:
temp_dict = {}
for i, k_v in enumerate(count.items()):
temp_dict[k_v[0]] = k_v[1] / len(bases[i])
temp_list.append(temp_dict)
bases.append(temp_list)
从性能的角度来看,列表理解更好,因为您不会不断地创建新的列表和字典,也不会调用像 append 这样的方法,这会产生一些开销。
你总是可以翻译一个列表理解,例如
ls = [<EXPR> for <VARS> in <ITERABLE> if <CONDITIONAL>]
到
ls = []
for <VARS> in <ITERABLE>:
if <CONDITIONAL>:
ls.append(<EXPR>)
理解中的多个for
子句对应翻译中的嵌套for
循环,最左边的for
子句对应最外层的for
循环。
生成器、字典和集合理解的翻译是类似的。