对列表列表进行列表理解的正确语法是什么?我正在使用一个字典。在列表列表中将一个值转换为另一个值的理解,但是我不能让它完成整个列表列表。这就是我所拥有的:
v_list = [['A'], ['V']]
test = {codon for (codon,AA) in translation.items() for aa in v_list if AA == aa}
如果v_list只是一个普通列表,那么这行代码就可以工作,但是我需要将这些字母保存在列表中的单独列表中。
使用
v_list[0][0]
有效,但我需要一个自动迭代列表中所有列表的解决方案,而不仅仅是我硬编码到程序中的那些。
谢谢!
EDIT 很抱歉这个问题很混乱。我的字典看起来像这样:
translation = {'TTT': 'F', 'TCT': 'S', 'TAT': 'Y', 'TGT': 'C',
'TTC': 'F', 'TCC': 'S', 'TAC': 'Y', 'TGC': 'C',
'TTA': 'L'}
我的输入如下:
in = [['S'],['F']]
所以我想把[0] [0]中的所有'S'和[1] [1]中的所有'F'都拉进去。但是'in'的长度是未知的,用户输入的是解析对象。所以我的输出有望看起来像这样:
out = [['TCT', 'TCC'], ['TTT', 'TTC']]
感谢您的帮助。
答案 0 :(得分:2)
你会使用类似的东西:
{codon for codon, AA in translation.items() for bb in v_list for aa in bb if AA == aa}
您可以添加多个for x in y
级别来迭代嵌套结构的多个级别。一些简单的例子:
a = [[1,2,3],[4,5,6]] # unwrapping a list two levels deep
[c for b in a for c in b] # gives [1, 2, 3, 4, 5, 6]
a = [[[1,2],[3,4]],[[5,6],[7,8]]] # a list of lists of lists
[d for b in a for c in b for d in c] # gives [1, 2, 3, 4, 5, 6, 7, 8]
显然你可以过度使用,当你这样做时很难跟踪。
答案 1 :(得分:0)
解决OP规范,即
v_list = [['S'],['F']]
translation = {
'TTT': 'F', 'TCT': 'S', 'TAT': 'Y', 'TGT': 'C', 'TTC': 'F',
'TCC': 'S', 'TAC': 'Y', 'TGC': 'C', 'TTA': 'L'
}
# expected output : [['TCT', 'TCC'], ['TTT', 'TTC']]
我认为你想要:
[[codon for codon, aa in translation.items() if aa in pp] for pp in v_list]
# [['TCT', 'TCC'], ['TTT', 'TTC']]
如果您真正想要的是平面设置(如what @avigil answered with),那么我建议以下内容,它只会遍历v_list
一次,有些可能会发现更具可读性:
amino_acids = {aa for pp in v_list for aa in pp}
{codon for codon, aa in translation.items() if aa in amino_acids}
# {'TCC', 'TCT', 'TTT', 'TTC'}