在字典中寻找模式并制作新的字典

时间:2016-12-09 09:07:48

标签: python parsing dictionary

我有一个列表,可以使用'K'制作所有序列组合  和'M',长度从6到18.所以,我有组合  包括"KKKKKK""MMMMMMMMMMMMMMMMMM"。  我还有一个字典,其中键是id,值是  长序列不仅由K和M组成,而且还有更多  对我来说不重要的人物。

小例子:

 com = ["KKKKKK", "KKKKKM", ......, "MMMMMMMMMMMMMMMMMM"]
 li = {id1: "KKKKKKHKJASGKKKMOOGBMMMMMMMMMMMMMMMMMM",
 id2:"MMKFJDFKFGKJJJJFKKKKKMJKJHFKKKKKK"}

我想在li字典(值)中找到不同的组合  创建一个新的字典,其中的键是来自li字典的ID  (键)和值是包含找到的组合的列表  李字典的价值观。对于小例子,输出将是  像这样:

results = {id1: ["KKKKKK", "MMMMMMMMMMMMMMMMMM"], id2: ["KKKKKM", "KKKKKK"] }

我写了下面的代码,但没有给我我想要的东西。

results = {}
 for i in com:
     if i in li.values():
         results[li.keys()] = [i]

2 个答案:

答案 0 :(得分:4)

您可以在词典理解中使用re.findall()

In [11]: {k: re.findall(r'(?:K|M){6,18}', v) for k, v in li.items()}
Out[11]: {'id1': ['KKKKKK', 'MMMMMMMMMMMMMMM'], 'id2': ['KKKKKM', 'KKKKKK']}

r'(?:K|M){6,18}'是一个正则表达式,可以匹配KM的任何子字符串,长度为6到18。

答案 1 :(得分:1)

问题在于:if i in li.values():。该行将检查字典的任何值是否等于当前组合。相反,你想要这个:

if v in li.values():
    if i in v:

将检查任何dict的值是否包含当前组合。 此外,此行results[li.keys()] = [i]会将所有dict的键映射到新列表。这有两个问题:首先,您只想映射相关的密钥。其次,您要添加到当前列表,而不是用新列表替换它。