我有一个列表,可以使用'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]
答案 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}'
是一个正则表达式,可以匹配K
或M
的任何子字符串,长度为6到18。
答案 1 :(得分:1)
问题在于:if i in li.values():
。该行将检查字典的任何值是否等于当前组合。相反,你想要这个:
if v in li.values():
if i in v:
将检查任何dict的值是否包含当前组合。
此外,此行results[li.keys()] = [i]
会将所有dict的键映射到新列表。这有两个问题:首先,您只想映射相关的密钥。其次,您要添加到当前列表,而不是用新列表替换它。