[英]How can I create a dictionary from a list where the keys are the indexes and the values are the actual elements of the list one by one?
[英]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.