计算集合中多值元素中特定字符串的出现次数
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
如果每个交互都是双向的,则存在三种可能性:
两个交互都在集合中表示:上面的循环将起作用。
仅表示一对中的一个交互:将循环更改为
for gene1, gene2 in geneInt:
intCounts[gene1] += 1
if gene1 != gene2:
intCounts[gene2] += 1
一些反向交互被表示,一些没有。在这种情况下,将 geneInt
转换为如开头所示的集合字典。
我已经生成了一个基因列表
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
如果每个交互都是双向的,则存在三种可能性:
两个交互都在集合中表示:上面的循环将起作用。
仅表示一对中的一个交互:将循环更改为
for gene1, gene2 in geneInt: intCounts[gene1] += 1 if gene1 != gene2: intCounts[gene2] += 1
一些反向交互被表示,一些没有。在这种情况下,将
geneInt
转换为如开头所示的集合字典。