计算集合中多值元素中特定字符串的出现次数

Count occurances of a specific string within multi-valued elements in a set

我已经生成了一个基因列表

genes = ['geneName1', 'geneName2', ...] 

以及他们的一组互动:

geneInt = {('geneName1', 'geneName2'), ('geneName1', 'geneName3'),...} 

我想找出每个基因有多少相互作用并将其放入向量(或字典)中,但我很难计算它们。我尝试了通常的方法:

interactionList = []
for gene in genes:
   interactions = geneInt.count(gene)
   interactionList.append(ineractions)

但是当然代码失败了,因为我的集合包含由两个值组成的元素,而我需要迭代其中的单个值。

尝试这样的事情,

interactions = {}

for gene in genes:
    interactions_count = 0
    for tup in geneInt:
        interactions_count += tup.count(gene)
    interactions[gene] = interactions_count

使用字典,并不断增加您在集合中每个元组中看到的每个基因的值 geneInt

interactions_counter = dict()

for interaction in geneInt:
    for gene in interaction:
        interactions_counter[gene]  = interactions_counter.get(gene, 0) + 1

dict.get(key, default) 方法 returns 给定键的值,如果键不存在,则指定默认值。 (More info)

对于集合 geneInt={('geneName1', 'geneName2'), ('geneName1', 'geneName3')},我们得到:

interactions_counter = {'geneName1': 2, 'geneName2': 1, 'geneName3': 1}

我认为您使用错误的数据结构来保存交互。您可以将交互表示为以基因名称为键的字典,其值是与其交互的所有基因的集合。

假设您当前有一个进程在某个时候执行类似的操作:

geneInt = set()
...
    geneInt.add((gene1, gene2))

改为

geneInt = collections.defaultdict(set)
...
    geneInt[gene1].add(gene2)

如果交互是对称的,添加一条线

    geneInt[gene2].add(gene1)

现在,要计算互动次数,您可以这样做

intCounts = {gene: len(ints) for gene, ints in geneInt.items()}

如果交互也是单向的,则计算原始列表很简单:

intCounts = dict.fromkeys(genes, 0)
for gene, _ in geneInt:
    intCounts[gene] += 1

如果每个交互都是双向的,则存在三种可能性:

  1. 两个交互都在集合中表示:上面的循环将起作用。

  2. 仅表示一对中的一个交互:将循环更改为

    for gene1, gene2 in geneInt:
        intCounts[gene1] += 1
        if gene1 != gene2:
            intCounts[gene2] += 1
    
  3. 一些反向交互被表示,一些没有。在这种情况下,将 geneInt 转换为如开头所示的集合字典。