7

背景から始めましょう。

このリストがあるとしましょう:

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 つの異なるエンティティ間の類似関係です。

したがって、O1P23に類似しており、O3P50に類似していますAND [O1, O3] は相互作用するため、相互作用 ['P23', 'P50'] は変換された相互作用です。

同様に、P2O40に類似しており、P19O22に類似しており、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 回だけ必要です。これらはすべて望ましくない動作です。

私の質問は、この問題を解決するための試みをどのように再構成できるかということです。

ありがとう。

4

3 に答える 3

1

類似関係が対称でも推移的でもない場合:

from collections import defaultdict
from itertools import product

# entity -> similar entities
d = defaultdict(list) # use `set` if `similar` has duplicate entries
for k, v in similar:
    d[k].append(v)

for a, b in interactions:
    for x, y in product(d[a], d[b]): 
       # a, b interact; a is similar to x, b is similar to y
       #note: filter undesired x, y interactions here
       print x, y # transformed interaction
于 2013-01-28T18:00:53.993 に答える
1

アルゴリズム全体についていくつかの推奨事項があります。

  • すべての類似関係の辞書を保持します。たとえば、O1:P23 と P23:O1 の両方を辞書に含めることができます。
  • 変換を見つける前に、インタラクションの両方の部分が変換できることを確認してください。たとえば、O1 と O3 は両方とも辞書のキーである必要があります。
  • これにより、不要な出力であると言った変換が O と P 一緒にリストされるのを防ぐことができます。
  • これが問題になると思われる場合は、結果の辞書を保持して重複をチェックすることもできます。

これらの問題のいくつかは JF Sebastian の回答で対処されていますが、元の辞書がどのように構築されているかに注意を払う必要があると思います。これにより、意味のある結果を簡単に得ることができます。

于 2013-06-12T17:13:28.813 に答える
0

リストを辞書に変換すると、辞書のキーを簡単に照合して、それらのキーで値を取得できます。

于 2013-02-21T11:05:56.040 に答える