Python:计算列表列表中元素对的频率

时间:2012-06-01 04:50:49

标签: python csv

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

line1 =(A,B,C)

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

line3 =(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

...

我认为一开始会很容易,但我很困惑。 请帮助我,并提前感谢你。

3 个答案:

答案 0 :(得分:7)

不是手动汇总频率,而是使用collections.counteritertools

from collections import Counter
from itertools import chain, combinations

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

其中lines是可迭代的名称迭代。

答案 1 :(得分:0)

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

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

请注意,如果您举行大型会议并且可能存在更高效的算法,则效率非常低。

答案 2 :(得分:0)

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