2014-12-05 73 views
3

我有以下列表:製作字典對象

name = ["Anne", "Jack", "Mary"] 

我也有一個嵌套列表,其中每個元素是另一個列表中,並與存在於name列表的索引的名字相連。這如下所示:

n1 = [[0, 0, 3], [0, 5, 5], [1, 3, 3]] 

所以對於'Anne',在列表name的第一個元素,從n1連接到它的列表是所述第一元件[0, 0, 3]

類似地,對於"Jack",在列表name的第二元件,從n1連接到它的列表是第二元件[0, 5, 5],等等。

我想統計n1的每個元素中每個數字的出現次數,並將它連接到字典格式的name列表中。

所以我想我的輸出看起來像下面:

{'Anne': {'0': 2, '3': 1}, 'Jack': {'0': 1, '5': 2}, 'Mary': {'1': 1, '3': 2}} 

我曾嘗試以下:

 from collections import Counter 
     clust = {} 
     for val in name: 
     clust[val] = {} 
     for e in n1: 
      wc = Counter(str(e1) for e1 in e) 
      clust[val] = dict(wc) 

但是這給了我輸出:

clust = {'Anne': {'1': 1, '3': 2}, 'Jack': {'1': 1, '3': 2}, 'Mary': {'1': 1, '3': 2}} 

哪是不正確的。我如何實現我想要的輸出?

回答

4

您需要將n1中的數據與name中的每一項匹配;最簡單的方法是用zip

>>> from collections import Counter 
>>> name = ["Anne", "Jack", "Mary"] 
>>> n1 = [[0,0,3], [0,5,5], [1,3,3]] 
>>> {name_: Counter(data) for name_, data in zip(name, n1)} 
{'Anne': Counter({0: 2, 3: 1}), 'Jack': Counter({5: 2, 0: 1}), 'Mary': Counter({3: 2, 1: 1})} 

(注意使用「字典理解」,見the docs的)

如果鑰匙放在Counter S是字符串是至關重要的,你可以使用map以計數之前整數轉換:

>>> {name_: Counter(map(str, data)) for name_, data in zip(name, n1)} 
{'Anne': Counter({'0': 2, '3': 1}), 'Jack': Counter({'5': 2, '0': 1}), 'Mary': Counter({'3': 2, '1': 1})} 
+1

OP有串鑰匙在櫃檯(不知道爲什麼,但無論如何,+1) – wim 2014-12-05 10:29:38

+2

@wim好點,我已經添加了一個選項 – jonrsharpe 2014-12-05 10:31:25

+0

有反正從輸出中刪除關鍵字「計數器」? – user1452759 2014-12-05 10:32:13

2

對於每一個名字,你的for e in n1:循環迴路在n的所有元素1,爲每個人製作一個計數器,並設置clust[val]的結果。所以clust[val]結果只是n1中最後一項的結果。

您應該使用zip()將兩個列表名稱和n1合併到一個或者更好的名稱列表以及從n1生成的計數器中。 zip()返回元組從兩份名單(zip([1, 2], ['a', 'b']) becomes [(1, 'a'), (2, 'b')]取出這些元件可以直接從這樣的元組進行dict

所以:。

clust = dict(zip(name, [Counter(e) for e in n1])) 
+0

有沒有什麼辦法從這個輸出中刪除關鍵字「Counter」? – user1452759 2014-12-05 10:31:00

+0

我把'Counter(e)'變成'dict(Counter(e))'。你失去了一些方便的功能,但你可能不需要它。 – RemcoGerlich 2014-12-05 10:31:49

1

只需使用name列表的索引值來算的n1項目子列表。這可以使用enumerate(name)完成。它返回值和它的索引。使用此返回的索引來計算name中項目對應的n1子列表中的項目。

>>> from collections import Counter 
>>> name = ["Anne", "Jack", "Mary"] 
>>> n1 = [[0,0,3], [0,5,5], [1,3,3]] 
>>> clust = {} 
>>> for i,val in enumerate(name): 
...  wc = Counter(str(e1) for e1 in n1[i]) 
...  clust[val] = dict(wc) 
... 
>>> clust 
{'Anne': {'0': 2, '3': 1}, 'Jack': {'0': 1, '5': 2}, 'Mary': {'1': 1, '3': 2}} 
0

你需要得到這個像這樣

from collections import Counter 
name = ["Anne", "Jack", "Mary"] 
n1 = [[0,0,3], [0,5,5], [1,3,3]] 
clust = {name[i]: Counter(n1[i]) for i in range(len(name))} 

輸出是:

{'Anne': Counter({0: 2, 3: 1}), 'Jack': Counter({5: 2, 0: 1}), 'Mary': Counter({3: 2, 1: 1})}

0

這裏是一個班輪得到你想要的輸出:

zip(name, [dict(Counter(z)) for z in [[str(y) for y in x] for x in n1]]) 

把它分解:

  • [[str(y) for y in x] for x in n1]轉換N1元素列出
  • dict(Counter(z))創建數列表爲每個N1列表
  • zip的元素結合兩個列表