2012-03-26 54 views
1

我有Python嵌套列表,我试图组织并最终计算出现次数。嵌套列表看起来像:如何为嵌套列表中的特定字符串创建子列表

[['22', '1'], ['21', '15'], ['11', '3'], ['31', '4'], ['41', '13'],...] 

首先我想要做的就是创建一个只包含“1”对应于第二项中嵌套列表子列表。我可以通过下面的命令来做到这一点:

Subbasin_1 = [] 
Subbasin_1.append([x for x in Subbasins_Imp if x[1] == '1']) 
print Subbasin_1 

给这些结果,这是正确的:

[['21', '1'], ['21', '1'], ['21', '1'], ['21', '1'], ['22', '1'],...] 

现在我想创建另一个子列表,这将使我所有的“21” Subbasin_1的每个嵌套列表。当我使用同一行脚本,但更改适当的项目时,我得到一个空列表。不知道发生了什么...?

OS_Count1 = [] 
OS_Count1.append([x for x in Subbasin_1 if x[0] == '21']) 
print OS_Count1 

结果是[[]] ???两者有什么区别? 感谢您的帮助...

回答

3

我不相信你的

[['21', '1'], ['21', '1'], ['21', '1'], ['21', '1'], ['22', '1'],...] 

线可以用你给的代码生成。你Subbasin_1.append行追加列表为空列表Subbasin_1,所以你应该得到类似

[[['22', '1'], ['21', '1']]] 

与嵌套的一个额外水平。

如果你避免空列表的不必要的建设+追加,你应该得到你想要的东西:

>>> Subbasins_Imp = [['22', '1'], ['21', '15'], ['11', '3'], ['31', '4'], ['41', '13'], ['21', '1']] 
>>> 
>>> Subbasin_1 = [x for x in Subbasins_Imp if x[1] == '1'] 
>>> print Subbasin_1 
[['22', '1'], ['21', '1']] 
>>> OS_Count1 = [x for x in Subbasin_1 if x[0] == '21'] 
>>> print OS_Count1 
[['21', '1']] 

或者,你可以简单地取代后面追加延长。我不建议这样做,但它可能会帮助你看到发生了什么:

>>> Subbasins_Imp = [['22', '1'], ['21', '15'], ['11', '3'], ['31', '4'], ['41', '13'], ['21', '1']] 
>>> 
>>> Subbasin_1 = [] 
>>> Subbasin_1.extend([x for x in Subbasins_Imp if x[1] == '1']) 
>>> print Subbasin_1 
[['22', '1'], ['21', '1']] 
>>> 
>>> OS_Count1 = [] 
>>> OS_Count1.extend([x for x in Subbasin_1 if x[0] == '21']) 
>>> print OS_Count1 
[['21', '1']] 
+0

非常感谢!奇迹般有效。你说得对,我为Subbasin_1做的第一个附加功能是给我一个三层深的名单。 – Linda 2012-03-26 12:53:03

0

没有什么区别,暗示在通话时Subbasin_1可能是空的或者不包含您认为它的数据。这也可能是Subbasin_1嵌套3层深,不2.

2

你的列表中理解[x for x in Subbasins_Imp if x[1] == '1']自行创建一个列表,当您将追加该列表Subbasin_1这意味着,你结束了一个双嵌套列表。

比较:

sub_imp = [['22', '1'], ['21', '15'], ['11', '3'], ['31', '4'], ['41', '13']] 
sub_1 = [x for x in sub_imp if x[1] == '1'] 
sub_2 = [] 
sub_2.append([x for x in sub_imp if x[1] == '1']) 

print(sub_1) 
print(sub_2) 
2

运行代码我得到一个三重嵌套列表....

Sub = [[['21','1'],....]] 

而不是做的:

Subbasin_1 = [] 
    Subbasin_1.append([x for x in Sub if x[1]=='1']) 

做简单的列表理解:

Subbasin_1 = [x for x in Sub if x[1] == '1'] 

这会给你你期待的结果。

+0

非常感谢! – Linda 2012-03-26 12:54:06

相关问题