背景から始めましょう。
このリストがあるとしましょう:
interactions = [ ['O1', 'O3'],
['O2', 'O5'],
['O8', 'O10']
['P3', 'P5'],
['P2', 'P19'],
['P1', 'P6'] ]
リスト内の各エントリ (例: O1, O3
) は、2 つのエンティティ間の相互作用です (ただし、ここで扱っているのはすべて文字列です)。リストにはさまざまなエンティティがあります。
次のリストもあります。
similar = ['O1', 'P23'],
['O3', 'P50'],
['P2', 'O40'],
['P19', 'O22']
各エントリは、2 つの異なるエンティティ間の類似関係です。
したがって、O1はP23に類似しており、O3はP50に類似していますAND [O1, O3] は相互作用するため、相互作用 ['P23', 'P50'] は変換された相互作用です。
同様に、P2はO40に類似しており、P19はO22に類似しており、AND [P2, P19] は相互作用するため、相互作用 ['O40', 'O22'] は変換された相互作用です。
変換された相互作用は、常に同じタイプ ([PX, PX] または [OX, OX]) からのものになります。
コード
そこで、これらの関係転送を生成するために次のコードを書きました。
from collections import defaultdict
interactions = [ ['O1', 'O3'],
['O2', 'O5'],
['O8', 'O10']
['P3', 'P5'],
['P2', 'P19'],
['P1', 'P6'] ]
similar = [ ['O1', 'H33'],
['O6', 'O9'],
['O4', 'H1'],
['O2', 'H12'] ]
def list_of_lists_to_dict(list_of_lists):
d = defaultdict(list)
for sublist in list_of_lists:
d[sublist[0]].append(sublist[1])
d[sublist[1]].append(sublist[0])
return d
interactions_dict = list_of_lists_to_dict(interactions)
similar_dict = list_of_lists_to_dict(similar)
for key, values in interactions_dict.items():
print "{0} interacts with: {1}".format(key, ', '.join(values))
if key in similar_dict:
print " {0} is similar to: {1}".format(key, ', '.join(similar_dict[key]))
forward = True
for value in values:
if value in similar_dict:
print " {0} is similar to: {1}".format(value, ', '.join(similar_dict[value]))
reverse = True
if forward and reverse:
print " thus [{0}, {1}] interact!".format(', '.join(similar_dict[key]),
', '.join(similar_dict[value]))
forward = reverse = False
私の試みは正しい出力を生成しますが、不要な出力も生成しました。たとえば、異なるタイプのエンティティ間で出力を生成する場合があります: O1, P1
、およびまったく同じエンティティ間: O1, O1
。また、重複した結果を異なる形式で出力します。例: O1, P1
, P1, O1
- どちらも同じことを意味するため、このエントリは 1 回だけ必要です。これらはすべて望ましくない動作です。
私の質問は、この問題を解決するための試みをどのように再構成できるかということです。
ありがとう。