6

実際、「会議」に関するデータセットがあります。たとえば、A、B、C が会議を持っている場合、リストは [A、B、C] になります。このように、各リストには会議に参加したメンバーのリストが含まれます。したがって:

line1= (A、B、C)

line2= (A、C、D、E)

line3 = (D,F,G)

...

各メンバーが何回会ったかを数えたいだけです。たとえば、メンバー A は line1 と line2 から C に 2 回会い、メンバー B は line1 から C に 1 回会います。ということで、こんな感じでグラフを作ってみました。

    A  B  C  D E F G...

 A  .  1  2  1 ...  

 B  1  . 1  0 

 C

...

最初は簡単だろうと思っていましたが、かなり混乱しています。どうぞよろしくお願いします。

4

3 に答える 3

8

周波数を手動で合計するのではなく、collections.counterとともに使用しitertoolsます。

from collections import Counter
from itertools import chain, combinations

meets = Counter(chain.from_iterable(combinations(line, 2) for line in lines))

lines名前のイテラブルのイテラブルはどこにありますか。

于 2012-06-01T05:16:01.327 に答える
0

行列の加法でこれを解決できるはずです。人数の総数(質問のG)がわかっている場合、答えはGxGマトリックスになります。line1の組み合わせでGxGマトリックスを作成し、line2の組み合わせでGxGマトリックスを追加します。

于 2012-06-01T05:08:01.133 に答える
0

これは、2D 配列または dict を使用した非常に単純なデータ構造の問題です。人数が多い場合は配列の方が効率的ですが、そうではないと仮定します。

times_met = defaultdict(int)
for line in lines:
     for pair in itertools.combinations(line, 2)
         times_met[pair] += 1

# How many times person a meets person b is described by the following (s.t. a < b)
print times_met[(a, b)]

大規模な会議があり、より効率的なアルゴリズムがおそらく存在する場合、これは非常に非効率的であることに注意してください。

于 2012-06-01T05:01:23.387 に答える