簡體   English   中英

如何從無序列表創建字典,其中列表包含鍵,然后是多個值?

[英]How can I create a dictionary from an unordered list, where the list contains the keys which are then followed by multiple values?

我有多個列表,它們的排序如下表所示:

['SNOMEDCT:', '263681008,', '771269000', 'UMLS:', 'C0443147,', 'C1867440', 'HPO:', 'HP0000006', 'HPO:', 'HP0000006', 'UMLS:', 'C0443147']

我需要將這個列表轉換成一個字典,最后以“:”作為鍵。 列表正在更改,因此有時會添加帶有“:”的新詞。 對應的值總是在列表中帶“:”的單詞后的下一個position。

當我開始迭代列表時,它很快就會變得令人沮喪,因為此刻對我來說有太多的可能性。 所以我想問一下,是否有人知道從這樣的列表到字典的快速轉換。

我嘗試了多個迭代過程,比如這里的那個來訪問帶有“:”的單詞:

checkwords = []
for charnum_list in df_new.char_num:
    try:
        for charnum in charnum_list:
            math.isnan(charnum)        
    except:
        new_charnum_list = []
        for charnum in charnum_list:
            charnum_new = charnum.replace('HP:','HP')
            charnum_new = charnum_new.replace('<','').replace('>','').split(' ')
            for word in charnum_new:
                checkwords.append(word)
diagnosis_dictionaries = list(set([word for word in checkwords if ':' in word]))

output:

diagnosis_dictionaries:

['HPO:', 'ICD9CM:', 'SNOMEDCT:', 'UMLS:', 'ICD10CM:']

然后我嘗試再次迭代以將列表與值和鍵與帶有鍵的列表進行比較(上圖),但在這一點上我真的很絕望,因為我的想法都沒有奏效。

如果有人有好主意或比我更好的解決方案,那就太好了。

如果我正確地解釋了你的問題,那么我認為你正在尋求這樣做:

lst = ['SNOMEDCT:', '263681008,', '771269000', 'UMLS:', 'C0443147,', 'C1867440', 'HPO:', 'HP0000006', 'HPO:', 'HP0000006', 'UMLS:', 'C0443147']

dct = dict()
k = None
for e in lst:
    if e[-1] == ':':
        k = e[:-1]
    else:
        if k is not None:
            dct.setdefault(k, []).append(e)
    
print(dct)

Output:

{'SNOMEDCT': ['263681008,', '771269000'], 'UMLS': ['C0443147,', 'C1867440', 'C0443147'], 'HPO': ['HP0000006', 'HP0000006']}

筆記:

對於問題中的樣本數據,不需要測試if k is not None 但是,如果列表被修改並且第一個元素不以冒號結尾,則該元素將被忽略。 沒有檢查元素數據類型——即假定它們是字符串

您可以使用itertools.groupby來創建字典。 例如:

from itertools import groupby


lst = ['SNOMEDCT:', '263681008,', '771269000', 'UMLS:', 'C0443147,', 'C1867440', 'HPO:', 'HP0000006', 'HPO:', 'HP0000006', 'UMLS:', 'C0443147']


out = {}
for k, g in groupby(lst, lambda i: i.endswith(":")):
    if k:
        out.setdefault(key := next(g).strip(":"), [])
    else:
        out[key].extend(map(lambda s: s.strip(","), g))

print(out)

印刷:

{
    "SNOMEDCT": ["263681008", "771269000"],
    "UMLS": ["C0443147", "C1867440", "C0443147"],
    "HPO": ["HP0000006", "HP0000006"],
}

暫無
暫無

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

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