2013-11-20 56 views
0

我的元组的列表的列表:计数元素=“”在元组列表的列表内

[[("AA","AA"),("QQ","")],[("CC",""),("QQ","")],...] 

我想算在元组的第二个值空值""的数量。在上述情况下这将是:

我需要与出现的每个嵌套列表之和的列表中的答案(在上面的例子中这将是[1,2,...]

。我试图像

with open(file, 'r') as f: 
    obj = pickle.load(f) 
    count=Counter(elem for elem in el for el in obj if elem[0]=="") 

东西是否有可能以某种方式使用2“为”为嵌套列表

回答

2

使用带有sum()列表理解和发电机的表达:?

[sum(1 for t in tups if t[1] == '') for tups in obj] 

演示:

>>> obj = [[("AA", "AA"), ("QQ", "")], [("CC", ""), ("QQ", "")]] 
>>> [sum(1 for t in tups if t[1] == '') for tups in obj] 
[1, 2] 
+0

有没有理由使用'sum'过,比方说,建设一个名单,并采取它的长度?因为它可以把一个发电机作为输入,所以'总和'更快? – mdml

+0

@mdml:当你需要做的只是计数时,为什么要创建一个完整的列表? 'sum()'与一个生成器表达式正好相反;计算列表中存在't [1] =='''元素的次数。 –

+0

@mdml:构造一个列表需要CPU和内存(并且分配内存相对昂贵),只是为了询问其长度。然后您再次丢弃列表对象。真的很浪费。 –

1
[sum(0 if x[1] else 1 for x in sub_lst) for sub_lst in big_list] 
+0

为什么使用条件表达式而不是过滤? –

+0

@MartijnPieters - 没有真正的好理由。因为字符串具有明确的布尔测试,所以我不喜欢'if t [1] =='''。但我真的不喜欢'如果不是'[1]'因此这似乎是一个好的妥协。我怀疑这两种方式都会有非常大的性能影响。 – mgilson

+1

@MartijnPieters - 我的第一个想法实际上是'sum(不是bool(x [1])for x in sub_lst)',但是对于python的初级用户来说这里有太多的魔力,并且它不那么明确,所以我放弃了它(这就是为什么你的答案在我的大约30秒之前发生的原因) – mgilson