[英]Can't unpack list structure for nested list comprehension
有问题创建一个简单的嵌套列表理解。 每个级别的解包都无法从列表结构中正确删除列表。 详情如下。
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的整个表达式必须是嵌套列表解析,以便稍后插入而不具有此占位符。 建议?
如果我理解你,你想要这个:
[v for i, (j, k) in set_list[:1] for v in k]
在“内部列表理解”示例中,不会发生解包,因为列表set_list
只是从set_list
每个项目中生成k
值,并且该项目是列表。
在您的原始示例中:
[[v for v in k] for i, (j, k) in set_list[:1]]
这些项目由v for v in k
解压缩v for v in k
,但是你通过从中创建一个新列表来重新打包它们(具有嵌套列表理解)。
你想要的不是嵌套列表理解,而只是一个包含多个for
子句的列表理解。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.