如何使用字典推导式遍历列表的列表?正确语法是什么?
我懂你的问题啦——你现在要处理嵌套列表里的氨基酸,从translation字典里找出对应的密码子,但原代码因为只遍历了外层的子列表,没法匹配到里面的单个氨基酸字符,对吧?
先说说你原代码的问题:你写的for aa in v_list这一步,遍历的是v_list里的每个子列表(比如['A']),而不是子列表里的单个氨基酸('A')。这样一来,AA == aa其实是拿字典里的字符串(比如'A')和列表(['A'])做比较,自然永远匹配不上,也就得不到你想要的结果。
接下来根据你的需求给你两种解决方案:
情况1:收集所有匹配的密码子(生成集合)
如果你的目标是把所有对应v_list中氨基酸的密码子收集到一个集合里,只需要在推导式里多加一层循环,遍历每个子列表里的元素就行:
v_list = [['A'], ['V']] # 假设你的translation字典是类似 {'GCU': 'A', 'GCC': 'A', 'GUU': 'V', 'GUC': 'V'} 这样的结构 test = {codon for codon, AA in translation.items() for sublist in v_list # 先遍历外层的每个子列表 for aa in sublist # 再遍历子列表里的每个氨基酸 if AA == aa}
这样就能正确遍历到'A'和'V',匹配字典里的氨基酸值,得到对应的密码子集合。
情况2:保留嵌套结构,替换氨基酸为密码子
如果你的需求是保留原嵌套列表的层级结构,把每个氨基酸替换成对应的密码子(比如把[['A'], ['V']]转成[['GCU', 'GCC'], ['GUU', 'GUC']]),那可以用嵌套的列表推导式来实现:
v_list = [['A'], ['V']] # 生成和原结构一致的密码子列表 result = [[[codon for codon, AA in translation.items() if AA == aa] for aa in sublist] for sublist in v_list]
这样得到的结果会完美保留原嵌套层级,每个子列表里的氨基酸都会被替换成对应的密码子列表。
额外:如果需要生成氨基酸到密码子的字典
你提到了“字典推导式”,如果你的目标是生成一个只包含v_list中氨基酸的映射字典,那可以先把嵌套列表扁平化,再用字典推导式:
v_list = [['A'], ['V']] # 先扁平化嵌套列表,拿到所有唯一的氨基酸 all_aas = {aa for sublist in v_list for aa in sublist} # 用字典推导式生成氨基酸到对应密码子的映射 aa_to_codons = {aa: [codon for codon, val in translation.items() if val == aa] for aa in all_aas}
这样得到的aa_to_codons就是{'A': ['GCU', 'GCC'], 'V': ['GUU', 'GUC']}这样的结构,方便后续调用。
内容的提问来源于stack exchange,提问作者dk09
相关产品推荐
相关产品推荐

