2016-12-09 9 views
1

を作り、私は配列の全ての組み合わせのリストは'K''M'で作ることができる持っており、長さは6から18までそうしている、私は"MMMMMMMMMMMMMMMMMM""KKKKKK"含む組み合わせ を持っています。 私はキーがidsであり、値が の長さのシーケンスでKとMだけでなく、もっと重要な文字である を持っている辞書もあります。辞書のパターンを探して、新しい辞書

小さな例:私はli辞書(値)で異なる組み合わせを見つけたい

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

と キーがli辞書 (キー)からのIDで、値がされた新しい辞書を作ります にある組み合わせを含むリストli辞書の値。小さな例えば出力は、このような 次のようになります。

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

私は、次のコードを書いたが、私が欲しいものを私に与えていません。

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

文字列内に文字列がある場合にマッチするreモジュール(正規表現モジュール)を確認してください。 https://docs.python.org/2/library/re.html –

答えて

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}'は、問題がある18

1

に長さ6でKまたはMの任意の部分文字列に一致します正規表現ですここに:if i in li.values():。この行は、辞書の値のいずれかが現在の組み合わせと等しいかどうかをチェックします。代わりに、次のようにします:

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

dictの値に現在の組み合わせが含まれているかどうかを確認します。 また、この行results[li.keys()] = [i]は、dictのすべてのキーを新しいリストにマップします。これには2つの問題があります。まず、関連するキーだけをマップしたいとします。次に、現在のリストに追加し、新しいリストで置き換えることはしません。

関連する問題