2014-10-06 254 views
0

我無法將嵌套列表與多個值的字典進行比較。 字典和嵌套列表是像這樣:Python:嵌套列表和字典比較

list = [[['a']], [['b']], [['c'], ['d']], [['e'], ['f'], ['g']]] 

dict = {'adv0' : ('a', 'b'), 'adv1' : ('f', 'c'), 'adv2' : ('d', 'e', 'q')} 

我想創建一個陣列,其中每個子列表( 'A', 'B', 'C & d', 'E &˚F& G')是與每個值相比較,如果子列表中的任何項目是該值的成員,則創建0條目,否則創建1條目。因爲'a'只在adv0,[0,1,1]中,因爲'b'只在adv0,[1,0,0]中,因爲adv1和adv2包含'c',因此'a'僅在adv0,[0,1,1]中。[0121] '或'd',[1,0,0],因爲adv1和adv2包含'e','f'或'g'中的一個。因此我們得到數組[0,1,1,0,1,1,1,0,0,1,0,0]。

下面的代碼是我的一個解決方案,可怕的嘗試不工作:

l = [] 
for sublist in list: 
     for items in sublist: 
     for x in items: 
      for key in dict: 
      if x in dict[key]: 
       l.extend('0') 
      elif x not in dict[key]: 
       l.extend('1') 
print l 
+0

請注意,詞典沒有排序。這聽起來像你想要的結果列表按自然排序的字典鍵排序 - 但它是很好的明確提到。 – 2014-10-06 21:03:52

回答

1

的一個問題是字典是無序的,所以你指望你可能無法通過按鍵進行迭代。使用OrderedDict或專門通過所需的密鑰迭代。這工作:

L = [[['a']], [['b']], [['c'], ['d']], [['e'], ['f'], ['g']]] 
D = {'adv0' : ('a', 'b'), 'adv1' : ('f', 'c'), 'adv2' : ('d', 'e', 'q')} 

l = [] 
for sublist in L: 
    for key in ('adv0','adv1','adv2'): 
     if any(item[0] in D[key] for item in sublist): 
      l.append(0) # changed to give explicit output you listed. 
     else: 
      l.append(1) # ditto 
print l 

輸出:

[0, 1, 1, 0, 1, 1, 1, 0, 0, 1, 0, 0] 
1

在這裏你去:(我改名爲輸入LST和DCT,以避免與內置listdict對象發生衝突)

[0 if any(v[0] in dct[k] for v in sublst) else 1 
    for sublst in lst 
    for k in sorted(dct.keys())] 

這很有趣。 (但是,不幸的是,3分鐘太晚了...)

+1

+1良好壓縮,仍然可讀。 – 2014-10-06 21:21:56

+0

我很驚訝類似的解決方案。 – 2014-10-06 21:24:23