如何在python中压缩列表列表?

如何在python中压缩列表列表?,python,list,Python,List,我有一份清单 sample = [['A','T','N','N'],['T', 'C', 'C', 'C']],[['A','T','T','N'],['T', 'T', 'C', 'C']]. 我正在尝试压缩文件,以便列表中只有A/T/G/C,并且输出需要是一个列表 [['AT','TCCC'],['ATT','TTCC']] 当我使用此代码时: tt = ["".join(y for y in x if y in {'A','G','T','C'}) for x in sample]

我有一份清单

sample = [['A','T','N','N'],['T', 'C', 'C', 'C']],[['A','T','T','N'],['T', 'T', 'C', 'C']].
我正在尝试压缩文件,以便列表中只有A/T/G/C,并且输出需要是一个列表

[['AT','TCCC'],['ATT','TTCC']]
当我使用此代码时:

tt = ["".join(y for y in x if y in {'A','G','T','C'}) for x in sample]
但是,我只得到以下输出:

['ATT','TTCC']
有什么建议我哪里出了问题吗

在我的实际代码中,我首先转换列表:

seq_list = [['TCCGGGGGTATC', 'TCCGTGGGTATC', ...]]  # one nested list

numofpops = len(seq_list)

### Tranposing. Moving along the columns only

#column_list = []
for k in range(len(seq_list)):
    column_list = [[] for i in range(len(seq_list[k][0]))]
    for seq in seq_list[k]:
        for i, nuc in enumerate(seq):
            column_list[i].append(nuc)
            ddd = column_list
    print ddd

tt = ["".join(y for y in x if y in {'A','G','T','C'}) for x in ddd]
print tt

我假设您提供的输入是一个列表中的两项。然后,您将使用具有两个嵌套级别的列表理解。在最深层,您过滤掉不是
A、T、G
C
的项目,然后
加入其他项目:

sample =  [[['A','T','N','N'],['T', 'C', 'C', 'C']], [['A','T','T','N'],['T', 'T', 'C', 'C']]]

result = [[''.join(i for i in lst if i in 'ATGC') for lst in sub] for sub in sample]
#                                  ^<- filter items
#           ^<- join the matching items
print(result)
# [['AT', 'TCCC'], ['ATT', 'TTCC']]
sample=[['A'、'T'、'N'、'N']、['T'、'C'、'C']、[['A'、'T'、'T'、'N']、['T'、'T'、'C'、'C']]
结果=[''.join(如果我在'ATGC'中,那么我在lst中代表我)在sub中代表lst]在样本中代表sub]

#^您要执行以下操作:

sample = [[['A','T','N','N'],['T', 'C', 'C', 'C']], [['A','T','T','N'],['T', 'T', 'C', 'C']]]
然后:

tt = [[''.join([c for c in sublist if c in 'AGTC']) for sublist in doublet] for doublet in sample]
这样可能更容易阅读:

tt = [
    [''.join([c for c in sublist if c in 'AGTC'])
     for sublist in doublet]
    for doublet in sample
]
它给出了期望的结果:

[['AT', 'TCCC'], ['ATT', 'TTCC']]

您可以首先创建一个助手函数:

def filterJoin(s):
    return ''.join(x for x in s if x in 'ATGC')
然后:

您的实际代码正在丢弃列表。您只能处理最后一个条目

否则,您的代码可以正常工作。只需在循环中执行此操作,然后将结果附加到某个最终列表:

results = []

for k in range(len(seq_list)):
    column_list = [[] for i in range(len(seq_list[k][0]))]
    for seq in seq_list[k]:
        for i, nuc in enumerate(seq):
            column_list[i].append(nuc)
    # process `column_list` here, in the loop (no need to assign to ddd)
    tt = ["".join(y for y in x if y in {'A','G','T','C'}) for x in column_list]

    results.append(tt)
请注意,您可以使用
zip()
函数代替换位列表:

results = []
for sequence in seq_list:
    for column_list in zip(*sequence):
        tt = [''.join([y for y in x if y in 'AGTC']) for x in column_list]
        results.append(tt)

我怀疑你使用的标签[zip]不是你的意思。您的
sample
看起来也不像列表列表。您不是在压缩(将元素从单独的序列中配对),而是在此处加入和筛选。您的
sample
不是有效的Python表达式。你能做一个吗?当输入数据无效时,我们几乎帮不上忙。您的示例代码和实际输出显示,只有
sample
表达式的后半部分实际用作输入。我已经按照代码的显示方式打印了代码。这里是指向我的整个代码以及输入和输出的链接。您的
示例
缺少一个逗号,使其无法成为有效的列表文字,真正的问题是OP误解了
打印
,将其添加到列表中。。他们有一个设置列表的循环,只有在循环完成后,他们才使用最后一个列表。@MartijnPieters我在OP编辑代码之前发布了答案。我将保留它,因为在这里使用helper函数的想法是相当自然的,尽管您公正接受的答案(+1)显示了实际问题是什么;他们为这样一份名单做了正确的事情,这是最后一份。然后他们在一条评论中发布了他们的实际代码(我随后将其添加到问题中),表明这都是一个X-Y问题。
results = []
for sequence in seq_list:
    for column_list in zip(*sequence):
        tt = [''.join([y for y in x if y in 'AGTC']) for x in column_list]
        results.append(tt)