繁体   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