使用字典理解来遍历列表列表
use dictionary comprehension to iterate over a list of list
对列表的列表进行列表理解的正确语法是什么?我正在使用字典。理解将一个值转换为列表列表中的另一个值,但我无法让它完成整个列表列表。这是我拥有的:
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]
可行,但我需要一个自动遍历列表中所有列表的解决方案,而不仅仅是我硬编码到程序中的列表。
谢谢!
编辑
很抱歉对这个问题感到困惑。我的字典看起来像这样:
translation = {'TTT': 'F', 'TCT': 'S', 'TAT': 'Y', 'TGT': 'C',
'TTC': 'F', 'TCC': 'S', 'TAC': 'Y', 'TGC': 'C',
'TTA': 'L'}
我的输入是这样的:
in = [['S'],['F']]
所以我想将所有 'S' 拉入 in[0][0] 并将所有“F”拉入 in[1][1]。但是 'in' 的长度未知,是用户作为解析对象输入的内容。所以我的输出应该是这样的:
out = [['TCT', 'TCC'], ['TTT', 'TTC']]
感谢您的帮助。
你会使用类似的东西:
{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]
显然,您可能会过度执行此操作,并且当您这样做时,事情会变得难以追踪,请谨慎使用。
嵌套列表输出
制定 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']]
平装
如果您真正想要的是平面集(如 ),那么我会建议以下内容,它只遍历 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'}
对列表的列表进行列表理解的正确语法是什么?我正在使用字典。理解将一个值转换为列表列表中的另一个值,但我无法让它完成整个列表列表。这是我拥有的:
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]
可行,但我需要一个自动遍历列表中所有列表的解决方案,而不仅仅是我硬编码到程序中的列表。
谢谢!
编辑 很抱歉对这个问题感到困惑。我的字典看起来像这样:
translation = {'TTT': 'F', 'TCT': 'S', 'TAT': 'Y', 'TGT': 'C',
'TTC': 'F', 'TCC': 'S', 'TAC': 'Y', 'TGC': 'C',
'TTA': 'L'}
我的输入是这样的:
in = [['S'],['F']]
所以我想将所有 'S' 拉入 in[0][0] 并将所有“F”拉入 in[1][1]。但是 'in' 的长度未知,是用户作为解析对象输入的内容。所以我的输出应该是这样的:
out = [['TCT', 'TCC'], ['TTT', 'TTC']]
感谢您的帮助。
你会使用类似的东西:
{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]
显然,您可能会过度执行此操作,并且当您这样做时,事情会变得难以追踪,请谨慎使用。
嵌套列表输出
制定 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']]
平装
如果您真正想要的是平面集(如 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'}