2013-11-20 59 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