2016-02-11 26 views
0

我正在嘗試爲下面的代碼片段編寫相應的列表理解。需要項目索引時的Python列表理解

# Initialize data. 
queryRelDict = {'1': [1, 2, 3], 
       '2': [4, 5, 6], 
       '3': [11, 13, 14]} 
related_docs_indices = [1, 2, 3, 4, 5, 6, 7, 8, 12, 13, 14] 

relOrNot = [0] * k 
for item in queryRelDict.keys(): 
    for i in range(len(related_docs_indices)): 
     if related_docs_indices[i] + 1 in queryRelDict[item]: 
      relOrNot[i] = 1 

基本上我有一本字典,其中每個鍵都有一個列表作爲它的值。現在,我的列表relOrNot[i]需要爲1,如果ithrelated_docs_indices的元素位於字典中的任一列表中。

所需的輸出是:

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

我嘗試以下兩種變體,但無法獲得所需的輸出。

relOrNot2 = [1 for item in queryRelDict.keys() for i in range(len(related_docs_indices)) if related_docs_indices[i] + 1 in queryRelDict[item]] 

但輸出

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

我也試過

relOrNot2 = [1 if related_docs_indices[i] + 1 in queryRelDict[item] else 0 for item in queryRelDict.keys() for i in range(len(related_docs_indices))] 

相應的輸出:

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

什麼修改是必要的,以獲得所需的輸出?

+1

我無法理解所需的輸出。它的長度與'related_docs_indices'不一樣。 – HYRY

+2

不要這樣做 - 你的代碼是完全正常的(特別是在可讀性方面);列表理解會違反[PEP-8(Python代碼樣式指南)](http://www.python.org/dev/peps/pep-0008/)和Python的Zen。 –

+0

你確定這是你想要的輸出嗎?它的長度是30,但是你在三個長度爲11的索引上迭代三個鍵。不是所需的結果長度是33嗎? – Alexander

回答

1

在這裏,如果你想在一個班輪:)

relOrNot = [1 if v in set().union(*queryRelDict.values()) else 0 for v in related_docs_indices]

1

如果您想要的輸出是一個列表relOrNot,其中relOrNot[i]是1,如果related_docs_indices第i個元素是在任何字典中queryRelDict(那麼它必須有相同的長度related_docs_indices)的名單,那麼你可以做的以下:

# first create one flat list with all elements of the sublists in the dictionary 
flatlist = [i for sublist in queryRelDict.itervalues() for i in sublist] 
relOrNot = [1 if i in flatlist else 0 for i in related_docs_indices] 
# [1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1] 
1

對每個鍵,您是通過迭代related_doc_indices並檢查是否有該密鑰的設定值內的匹配值。對於關鍵的「1」,它應該是這樣的:

key 1 values = [1, 2, 3] 

related_docs_indices = [ 
    1, # 1 (match) 
    2, # 1 (match) 
    3, # 1 (match) 
    4, # 0 (no match) 
    5, # 0 (no match) 
    6, # 0 (no match) 
    7, # 0 (no match) 
    8, # 0 (no match) 
    12, # 0 (no match) 
    13, # 0 (no match) 
    14] # 0 (no match) 

該鍵的所需的輸出因此應該是:

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

一個問題,你必須是鍵在字典無序的,所以長列表的結果可以根據鍵的隨機順序而變化。例如:

>>> queryRelDict.keys() 
['1', '3', '2'] 

比方說,你第一個鍵進行排序的話,我相信所需的輸出應該是這樣的:

[1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, # key '1' 
0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, # key '2' 
0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1] # key '3' 

keys = queryRelDict.keys() 
keys.sort() 
>>> [1 if i in queryRelDict.get(item) else 0 
    for item in keys for i in related_docs_indices] 
#[1, 2, 3, 4, 5, 6, 7, 8, 12, 13, 14] related_doc_indices 
[1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, # key '1' values: [1, 2, 3] 
0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, # key '2' values: [4, 5, 6] 
0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1] # key '3' values: [11, 13, 14] (note 11 is not in related_doc_indices) 
1

創建一組與所有按鍵和所有的值,並在你的循環只是看看所需的值是否在集合中。

s = set() 
for (k,v) in queryRelDict.items(): 
    s.add(int(k))# because your keys are string 
    s = s | set(v) 
map(lambda x:1 if x in s else 0, related_docs_indices) 

=>[1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1]