从制表符分隔文件创建一个不是1:1的python字典

时间:2017-07-26 20:07:38

标签: python python-3.x dictionary tuples

我想从制表符分隔文件(无标题)创建两个python3字典。该文件有2列,我想命名为group_id和gene_id。一组可以具有多个基因,并且基因可以属于多个组。我将通过一个简单的例子展示我想要的东西。

group_id gene_id

A        a
A        b
A        c
A        d
B        a
B        c
B        e

我想要2个词典:

dict1 = {'A':(a,b,c,d),'B':(a,c,e)}

dict2 = {'a':(A,B), 'b':(A), 'c':(A,B), 'd':(A), 'e':(B)}

我想将值存储在元组中以提高速度,因为我的文件是2.5 GB,我最终会得到一些我以后必须使用的大词典。

我知道有很多类似这样的问题,但是当我们处理具有关键:值对的文件时,我无法找到答案。

谢谢!

2 个答案:

答案 0 :(得分:1)

我认为代码在这里说不出话来,但基本上因为你正在使用字符串,你可以只有两个单独的dicts,然后解析每一行。如果您有新值,则必须创建一个新条目,使用if语句。有一点,您应该使用列表,因为元组是不可变的,并且在创建它们后无法更改:

data = """group_id gene_id
    A        a
    A        b
    A        c
    A        d
    B        a
    B        c
    B        e"""

lines = data.splitlines()
group_dict = {}
gene_dict = {}

for line in lines[1:]:
    group, gene = line.split()
    if group not in group_dict.keys():
        group_dict[group] = list()
    group_dict[group].append(gene)

    if gene not in gene_dict.keys():
        gene_dict[gene] = list()
    gene_dict[gene].append(group)

from pprint import pprint
pprint(group_dict)
pprint(gene_dict)

打印:

{'A': ['a', 'b', 'c', 'd'], 'B': ['a', 'c', 'e']}
{'a': ['A', 'B'], 'b': ['A'], 'c': ['A', 'B'], 'd': ['A'], 'e': ['B']}

答案 1 :(得分:1)

collections模块有一个defaultdict方法,它返回一个新的类字典对象。只需将值附加到每个键上即可完成。

from collections import defaultdict
dict1 = defaultdict(list)
dict2 = defaultdict(list)

with open("C:/path/example.txt") as f:
    header = f.next()
    for line in f:
        if line.strip():
            a,b =  line.strip().split()
            dict1[a].append(b)
            dict2[b].append(a)

print dict1

返回

defaultdict(<type 'list'>, {'A': ['a', 'b', 'c', 'd'], 'B': ['a', 'c', 'e']})

dict2

defaultdict(<type 'list'>, {'a': ['A', 'B'], 'c': ['A', 'B'], 'b': ['A'], 'e': ['B'], 'd': ['A']})