6

实际上,我有一个关于“会议”的数据集。例如,A,B,C 开会,那么列表将是 [A,B,C]。像这样,每个列表将包含参加会议的成员列表。所以:

第 1 行 = (A,B,C)

第 2 行 = (A,C,D,E)

第 3 行 = (D,F,G)

...

我只想数一数每对成员见面的次数。例如,成员 A 从 line1 和 line2 与 C 会面两次,而成员 B 从 line1 与 C 会面一次。所以,我想做一个这样的图表..

    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

这是一个非常简单的二维数组或字典的数据结构问题。如果你有很多人,数组会更有效,但我假设你没有。

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 回答
0

看起来你应该能够通过矩阵加法来解决这个问题。如果您知道总人数(问题中的 G),那么您的答案将是 GxG 矩阵。用 line1 的组合创建一个 GxG 矩阵,然后用 line2 的组合添加一个 GxG 矩阵,等等。

于 2012-06-01T05:08:01.133 回答