2014-09-03 96 views
3

我有兩個文件,我想從文件1中提取一些值,像這樣的關鍵:提取物:Python字典,有多個值

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() 
+0

更新了我的答案 – OregonTrail 2014-09-03 07:43:06

回答

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() 

如果你真的想打印是每個基因的計數,然後用len(count)替換"\t".join(count),列表的長度。

+0

謝謝,我現在明白了!做一個列表 !!!好吧,還有一個小問題,有沒有辦法讓結果「更好」的輸出?現在用你的代碼我得到4 [[word1],[word2]] ...有可能讓他們更像'4 word1 \ n 4 word2'嗎?否則,我總是可以使用sed或awk,但我只是想知道!謝謝!! – user3188922 2014-09-03 07:47:22

+0

我更新了它來解決這個問題,這就是'\ t「.join(count)'應該做的事情。 – OregonTrail 2014-09-03 07:48:56

+0

我將其刪除:Error:output_file.write('{0} \ t {1} \ n'.format(gene,「\ t」.join(count))) TypeError:序列項目0:期望的字符串,找到的列表 – user3188922 2014-09-03 07:51:08

1

您是否考慮過使用​​。您可以將文件加載到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您蘆葦文件,在9您可以通過數字的值進行過濾的文件,在13連接兩個過濾文件一起。
然後,您可以對它進行排序,然後用字典進行計算。

UPDATE
要根據條件篩選pandas.DataFrame該列的值是在一些列表中,您可以用isin給它列表或使用range例如。

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

這很有趣,從來沒有聽說過熊貓我會檢查出來!但是如果文件2是1000行,那麼你不能手動完成!'?! – user3188922 2014-09-03 07:57:43

+0

我不太明白你所說的「手動做」,請解釋一下。 – 2014-09-03 08:00:00

+0

我只是說你似乎輸入一行代碼例如(file1.number == 4),但如果數字4可能需要多達1000個不同的數字呢?無論如何,我對熊貓一無所知,但我會檢查它,謝謝你的提示! – user3188922 2014-09-03 08:01:26