簡體   English   中英

需要項目索引時的Python List理解

[英]Python List comprehension when item index is required

我正在嘗試為以下代碼段編寫相應的列表理解。

# 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,如果ith元素related_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]

為了獲得所需的輸出,必須進行哪些修改?

如果您想要的輸出是一個列表relOrNot ,其中relOrNot[i]為1,如果第i個元素related_docs_indices是無論是在字典中列出的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]

對於每個鍵,您要遍歷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)

創建一個包含所有鍵和所有值的集合,然后在循環中查看是否需要的值在集合中。

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]

在這里,如果您要單線:)

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM