2012-06-01 8 views
5

実際には、私は "会議"についてのデータセットを持っています。 たとえば、A、B、Cに会議がある場合、リストは[A、B、C]になります。 このように、各リストには、会議に参加したメンバーのリストが含まれます。 したがって:Python:リストのリスト内の要素のペアの頻度を計算する

LINE1 =(A、B、C)

LINE2 =(A、C、D、E)

LINE3 =(D、F、G)

..

メンバーの各ペアが互いに出会った回数を数えたいと思います。 たとえば、メンバーAは、line1とline2から2回Cを満たし、メンバーBはline1から1回Cを満たします。だから、私は

A B C D E F G... 

A . 1 2 1 ... 

B 1 . 1 0 

C 

は...私はそれが最初では簡単だろうと思ったが、私はかなり混乱しています..このようなグラフを作成したいと思います。 私に助けてあげてくれてありがとう。

+1

行列を掛ける方法を学ぶ時間... –

答えて

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)] 

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

+1

タプル→intのdictがもっと意味をなさないと思うので、 'people_met [(person1、person2)]'はそれらの間のミーティングです。次に、 'defaultdict'である必要はありません。最初は' itertools.combinations'から最初に入力してください。 – lvc

+0

@lvc 'defaultdict(int)'は意味的に意味があります。新しい人物がデータセットに参加すると、彼は他の人と会った回数を聞いて、「KeyError」ではなく、正しい答え-0-を得ることができます。またゼロで初期化することはかなりPythonではありません。あなたは 'defaultdict'を決して必要としませんが、より良いコードを書くことができます。 – agf

+0

編集はうまくいきますが、大規模なデータセットでは、組み合わせの代わりに、その行のデカルト積を生成するため、これはまだ効率的ではありません。 Pythonは電池が内蔵されていることを覚えておいてください。すでにこれを行う方法があります。 – agf

0

行列の追加でこれを解決できるはずです。人の総数(問題のG)を知っていれば、あなたの答えはGxG行列になります。

7

等、LINE2の組み合わせでGXG行列に追加し、LINE1から組み合わせでGXG行列を作成するのではなく、手動で加算周波数、itertoolsと共にcollections.counterを使用:

from collections import Counter 
from itertools import chain, combinations 

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

linesである場合名前の反復可能なもの。

+0

+1はPythonライブラリを使用しています。どこかにすべてがあります。 >:P –

+0

解決策のために+ 1を吹き飛ばして自明です。私はあなたの答えまで気付かなかったので自分自身を蹴っています。もう一つの答えが 'defaultdict(int)'を使い、 'd [item] + = 1'をたくさんすると、それは' Counter 'のようなものです。 「私は数えたい...」という質問はもちろんです。 – lvc

+1

これは、要素がすべてのリストで同じ順序である場合にのみ機能することに注意してください。 '{1,2}、[2,1]])のxの組み合わせ({{(1,2):1、(2,1)})は、 :1}) '。順序にかかわらず各ペアリングを数えたい場合は、各リストを最初にセットにしてください: 'set([1,2])、set([2、 1])))) 'は' Counter({(1,2):2}) 'を生成します。 – Katrina

関連する問題