0

在创建简单的嵌套列表理解时遇到问题。每个级别的解包都不会从列表结构中正确删除列表。详情如下。

file_list = ['genes1.csv', 'genes2.csv']

set_list = [('genes2.csv', (['A2LD1', 'A1BG', 'A2ML1', 'A1CF', 'A2M', 'A2BP1'], [-0.95, 1.226, 3.473, 4.958, 6.645, 11.953])), ('genes1.csv', (['A2LD1', 'A1BG', 'A2ML1', 'A1CF', 'A2M', 'A2BP1'], [-0.529, 1.444, 3.133, 4.303, 6.387, 11.117]))]

set_list.sort(key = lambda (x,y): file_list.index(x))

我们看一下排序后的set_list:

print '\nset_list sorted:', set_list

set_list sorted: [('genes1.csv', (['A2LD1', 'A1BG', 'A2ML1', 'A1CF', 'A2M', 'A2BP1'], [-0.529, 1.444, 3.133, 4.303, 6.387, 11.117])), ('genes2.csv', (['A2LD1', 'A1BG', 'A2ML1', 'A1CF', 'A2M', 'A2BP1'], [-0.95, 1.226, 3.473, 4.958, 6.645, 11.953]))]

现在我们将只提取样本 1 的值,在这种情况下,来自genes1.csv 的值:

sample_1_values = []
for i, (j, k) in set_list[:1]:
    for v in k:
        sample_1_values.append(v)

print '\nsample 1 values:', sample_1_values

和输出:

sample 1 values: [-0.529, 1.444, 3.133, 4.303, 6.387, 11.117]

现在的目标是创建 sample_1_values 作为嵌套列表理解:

sample_1_values = [[v for v in k] for i, (j, k) in set_list[:1]]

print '\nsample_1_values from list comprehension:', sample_1_values

和输出:

[[-0.529, 1.444, 3.133, 4.303, 6.387, 11.117]]

让我们分解嵌套结构,首先:

s_list_comp_1 = [k for i, (j, k) in set_list[:1]]

print '\ninner list comprehension:', s_list_comp_1
print type(s_list_comp_1)

输出:

inner list comprehension: [[-0.529, 1.444, 3.133, 4.303, 6.387, 11.117]]
<type 'list'>

没有进行拆包。现在对于外部嵌套:

s_list_comp_2 = [v for v in s_list_comp_1]

print '\nouter list comprehension', s_list_comp_2
print type(s_list_comp_2)

输出:

[[-0.529, 1.444, 3.133, 4.303, 6.387, 11.117]]
<type 'list'>

同样的问题,这次没有解压清单。使用 for 语句和 append,我们可以看到它正确:

s_list_comp_2 = []
for v in s_list_comp_1:
    for l in v:
        s_list_comp_2.append(l)

print '\ncorrect unpacking:', s_list_comp_2

输出:

correct unpacking: [-0.529, 1.444, 3.133, 4.303, 6.387, 11.117]

正确的解包需要另一个层次结构,这是我无法使用嵌套列表理解复制的。创建 sample_1_values 的整个表达式必须是嵌套列表推导,以便稍后插入而无需此占位符。建议?

4

1 回答 1

2

如果我理解你的话,你想要这个:

[v for i, (j, k) in set_list[:1] for v in k]

在您的“内部列表理解”示例中,不会发生拆包,因为列表理解只是k从 中的每个项目产生值set_list,并且该项目是一个列表。

在您的原始示例中:

[[v for v in k] for i, (j, k) in set_list[:1]]

这些项目由 解包v for v in k,但您通过从它们中制作一个新列表来重新打包它们(使用嵌套列表理解)。

您想要的不是嵌套列表推导,而只是带有多个for子句的单个列表推导。

于 2013-05-26T19:09:54.793 回答