使用字典理解迭代列表

时间:2018-03-22 20:26:01

标签: python bioinformatics

对列表列表进行列表理解的正确语法是什么?我正在使用一个字典。在列表列表中将一个值转换为另一个值的理解,但是我不能让它完成整个列表列表。这就是我所拥有的:

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']]

感谢您的帮助。

2 个答案:

答案 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']]

Flat Set

如果您真正想要的是平面设置(如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'}