提取:Python字典,具有多个值的键

时间:2014-09-03 07:34:56

标签: python dictionary

我有两个文件,我试图从文件1中提取一些值,如下所示:

File1:
2    word1
4    word2
4    word2_1
4    word2_2
8    word5
8    word5_3

File 2:
4
8

我想要的是提取从4和8开始的每一行(从文件2开始)并且它们很多。 所以通常如果只有一行匹配,我会使用python字典,一键一元素容易!但是现在我有多个元素匹配到同一个键,我的脚本只会提取最后一个(很明显,因为它会删除以前的!)。 所以我知道这不是它的工作原理但我不知道如果有人可以帮助我开始我会很高兴。

这是我的常规"代码:

gene_count = {}
my_file = open('file1.txt')
for line in my_file:
    columns = line.strip().split()
    gene = columns[0]
    count = columns[1:13]
    gene_count[gene] = count

names_file = open('file2.txt')
output_file = open('output.txt', 'w')

for line in names_file:
    gene = line.strip()
    count = gene_count[gene]
    output_file.write('{0}\t{1}\n'.format(gene,"\t".join(count)))

output_file.close()

2 个答案:

答案 0 :(得分:1)

制作字典的值,列表并附加到它们。

一般来说:

from collections import defaultdict
my_dict = defaultdict(lambda: [])

for x in xrange(101):
    if x % 2 == 0:
        my_dict['evens'].append(str(x))
    else:
        my_dict['odds'].append(str(x))

print 'evens:', ' '.join(my_dict['evens'])
print 'odds:', ' '.join(my_dict['odds'])

在您的情况下,您的值是列表,因此将列表添加(连接)到您的词典列表中:

from collections import defaultdict
gene_count = defaultdict(lambda: [])

my_file = open('file1.txt')
for line in my_file:
    columns = line.strip().split()
    gene = columns[0]
    count = columns[1:13]
    gene_count[gene] += count

names_file = open('file2.txt')
output_file = open('output.txt', 'w')

for line in names_file:
    gene = line.strip()
    count = gene_count[gene]
    output_file.write('{0}\t{1}\n'.format(gene,"\t".join(count)))

output_file.close()

如果您确实要打印的是每个基因的计数,请将"\t".join(count)替换为列表长度len(count)

答案 1 :(得分:1)

您是否考虑过使用pandas。您可以将文件加载到DataFrame中,然后对其进行过滤:

In [5]: file1 = pn.read_csv('file1',sep='    ', 
                            names=['number','word'],
                            engine='python')

In [6]: file1
Out[6]: 
   number     word
0       2    word1
1       4    word2
2       4  word2_1
3       4  word2_2
4       8    word5
5       8  word5_3

In [9]: file1[(file1.number==4) | (file1.number==8)]
Out[9]: 
   number     word
1       4    word2
2       4  word2_1
3       4  word2_2
4       8    word5
5       8  word5_3

In [13]: foo = file1[(file1.number==4) | (file1.number==8)].append(file2[(file2.number==4) | (file2.number==8)])
Out[13]: 
   number     word
1       4    word2
2       4  word2_1
3       4  word2_2
4       8    word5
5       8  word5_3
1       4    word2
2       4  word2_1
3       4  word2_2
4       8    word5
5       8  word5_3

在5 reed文件中,在9中你用数字值过滤文件,在13中你将两个过滤后的文件加在一起。
然后,您可以使用字典对它进行排序并更轻松地进行计算。

<强>更新
要按列值在某个列表中的条件过滤pandas.DataFrame,您可以使用isin给出列表或使用range

In [46]: file1[file1.number.isin([1,2,3])]
Out[46]: 
   number   word
0       2  word1