I would argue that you are using the wrong data structure to hold interactions. You can represent interactions as a dictionary keyed by gene name, whose values are a set of all the genes it interacts with.
Let's say you currently have a process that does something like this at some point:
geneInt = set()
...
    geneInt.add((gene1, gene2))
Change it to
geneInt = collections.defaultdict(set)
...
    geneInt[gene1].add(gene2)
If the interactions are symmetrical, add a line
    geneInt[gene2].add(gene1)
Now, to count the number of interactions, you can do something like
intCounts = {gene: len(ints) for gene, ints in geneInt.items()}
Counting your original list is simple if the interactions are one-way as well:
intCounts = dict.fromkeys(genes, 0)
for gene, _ in geneInt:
    intCounts[gene] += 1
If each interaction is two-way, there are three possibilities:
- Both interactions are represented in the set: the above loop will work. 
- Only one interaction of a pair is represented: change the loop to - for gene1, gene2 in geneInt:
    intCounts[gene1] += 1
    if gene1 != gene2:
        intCounts[gene2] += 1
 
- Some reverse interactions are represented, some are not. In this case, transform - geneIntinto a dictionary of sets as shown in the beginning.