2017-07-19 3 views
2

Bitte ich brauche wieder Hilfe.Vergleichen des ersten Wörterbuchs mit Werten aus dem zweiten Wörterbuch

Ich habe eine große Datenbankdatei (nennen wir es db.csv) mit vielen Informationen.

Vereinfachtes Datenbankdatei zu veranschaulichen:

Simplified database file to illustrate

Ich betreibe usearch61 -cluster_fast auf meine Gene Sequenzen, um sie zu gruppieren.
Ich habe eine Datei mit dem Namen 'clusters.uc' erhalten. Ich öffnete es als csv und dann machte ich einen Code, um ein Wörterbuch zu erstellen (sagen wir dict_1), um meine Clusternummer als Schlüssel und meine gen_id (VFG ...) als Werte zu haben.
Hier ist ein Beispiel dessen, was ich in einer Datei gespeichert dann gemacht: dict_1

0 ['VFG003386', 'VFG034084', 'VFG003381'] 
1 ['VFG000838', 'VFG000630', 'VFG035932', 'VFG000636'] 
2 ['VFG018349', 'VFG018485', 'VFG043567'] 
... 
14471 ['VFG015743', 'VFG002143']  

So weit so gut. Dann mit db.csv ich ein anderes Wörterbuch gemacht (dict_2) wurden gene_id (VFG ...) sind Schlüssel und VF_Accession (IA ... oder CVF .. oder VF ...) sind Werte, Abbildung: dict_2

VFG044259 IA027 
VFG044258 IA027 
VFG011941 CVF397 
VFG012016 CVF399 
... 

Was ich am Ende will, ist für jeden VF_Accession die Zahl der Clustergruppen zu haben, Abbildung:

IA027 [0,5,6,8] 
CVF399 [15, 1025, 1562, 1712] 
... 

Also ich denke, da ich noch ein Anfänger in Codierung bin, die ich brauche einen Code zu erstellen, zu vergleichen, Werte von dict_1 (VFG ...) bis zu Tasten von dict_2 (VFG ...). Wenn sie übereinstimmen, setzen Sie VF_Accession als Schlüssel mit allen Clusternummern als Werte. Da VF_Accession Schlüssel sind, die sie nicht duplizieren können, brauche ich ein Wörterbuch der Liste. Ich denke ich kann das machen, weil ich es für dict_1 gemacht habe. Aber mein Problem ist, dass ich keinen Weg finde, Werte von dict_1 mit Schlüsseln von dict_2 zu vergleichen und jedem Cluster eine VF_Accession-Nummer zu geben. Bitte hilf mir.

+0

ich nicht wissen viel über bio - kann die gleiche gen_id (VFG) in mehreren Clustern erscheinen? –

+0

Ja einige von ihnen sind leider. Vielleicht haben sowas IA027 [0 | 12, 5, 6, 8] oder IA027 [0 (12), 5, 6, 8] –

Antwort

3

Zuerst geben wir Ihren Wörterbüchern einige bessere Namen als , dict_2, ... das macht es einfacher, mit ihnen zu arbeiten und sich daran zu erinnern, was sie enthalten.

Sie erstellt zunächst ein Wörterbuch, die Cluster-Nummern als Schlüssel und gene_ids (VFG ...) als Wert hat:

cluster_nr_to_gene_ids = {0: ['VFG003386', 'VFG034084', 'VFG003381', 'VFG044259'], 
          1: ['VFG000838', 'VFG000630', 'VFG035932', 'VFG000636'], 
          2: ['VFG018349', 'VFG018485', 'VFG043567', 'VFG012016'], 
          5: ['VFG011941'], 
          7949: ['VFG003386'],        
          14471: ['VFG015743', 'VFG002143', 'VFG012016']} 

Und Sie haben auch ein anderes Wörterbuch, wo gene_ids sind Schlüssel und VF_Accessions (IA ... oder CVF .. oder VF ...) Sind Werte:

gene_id_to_vf_accession = {'VFG044259': 'IA027', 
          'VFG044258': 'IA027', 
          'VFG011941': 'CVF397', 
          'VFG012016': 'CVF399', 
          'VFG000676': 'VF0142', 
          'VFG002231': 'VF0369', 
          'VFG003386': 'CVF051'} 

Und wollen wir ein Wörterbuch schaffen, wo jeder VF_Accession Schlüssel die Anzahl der Clustergruppen als Wert hat: vf_accession_to_cluster_groups.

Wir bemerken auch, dass ein VF Beitritt zu mehrere Gen-IDs gehört (zum Beispiel: die VF Beitritt IA027 hat sowohl die VFG044259 und das VFG044258 Gen-IDs

So verwenden wir defaultdict einen Wörterbuch mit VF Beitritt zu machen, wie. Schlüssel und eine Liste von Gen-IDs als Wert

from collections import defaultdict 
vf_accession_to_gene_ids = defaultdict(list) 
for gene_id, vf_accession in gene_id_to_vf_accession.items(): 
    vf_accession_to_gene_ids[vf_accession].append(gene_id) 

Für die Beispieldaten über I geschrieben, sieht vf_accession_to_gene_ids jetzt wie:

defaultdict(<class 'list'>, {'VF0142': ['VFG000676'], 
          'CVF051': ['VFG003386'], 
          'IA027': ['VFG044258', 'VFG044259'], 
          'CVF399': ['VFG012016'], 
          'CVF397': ['VFG011941'], 
          'VF0369': ['VFG002231']}) 

Jetzt können wir jeden VF-Beitritt wiederholen und seine Liste der Gen-IDs nachschlagen. Dann wird für jedes Gen ID, wir Schleife über alle Cluster und sehen, ob das ID-Gen vorhanden ist:

vf_accession_to_cluster_groups = {} 
for vf_accession in vf_accession_to_gene_ids: 
    gene_ids = vf_accession_to_gene_ids[vf_accession] 
    cluster_group = [] 
    for gene_id in gene_ids: 
     for cluster_nr in cluster_nr_to_gene_ids: 
      if gene_id in cluster_nr_to_gene_ids[cluster_nr]: 
       cluster_group.append(cluster_nr) 
    vf_accession_to_cluster_groups[vf_accession] = cluster_group 

Das Endergebnis für die obigen Beispieldaten ist nun:

{'VF0142': [], 
'CVF051': [0, 7949], 
'IA027': [0], 
'CVF399': [2, 14471], 
'CVF397': [5], 
'VF0369': []} 
+0

Ich bin wirklich wirklich aufrichtig dankbar für deine Hilfe, aber es bleiben nur wenige Probleme, wenn du mir bitte weiterhelfen kannst: In cluster_nr_to_gene_ids kann eine gleiche gen_id viele Clusternummern haben. Abbildung: 0 ['VFG003386'] 7949 ['VFG003386'] also vf_accession sollte diese beiden Cluster-Gruppen enthalten. CVF051 ['0, 7949'] aber es gibt mir nur eins: CVF051 [0] –

+0

@rookiemax, mein Code funktioniert, wenn eine Gen-ID in mehreren Clustern ist, siehe meine Beispieldaten, die ich mit dem von Ihnen bereitgestellten Beispiel aktualisiert habe. Sehen Sie entweder, dass Sie etwas falsch machen, oder Sie müssen mir einen vollständigeren Datensatz zur Verfügung stellen, um zu sehen, wo etwas schief läuft. – BioGeek

+1

Sie haben Recht Ich habe etwas falsch gemacht, mein schlechtes. Es funktionierte perfekt, nachdem ich eine Zeile meines Codes entfernt hatte: D Ich bin wirklich dankbar, vielen Dank für Ihre Hilfe: D tanken Sie wirklich: D –

1

Vorbehalt: Ich mache nicht viel Python-Entwicklung, also gibt es wahrscheinlich einen besseren Weg, dies zu tun. Sie können zuerst die VFG ... gene_ids ihre Clusternummern zuzuordnen, und dann, dass das zweite Wörterbuch zu verarbeiten verwenden:

from collections import defaultdict 
import sys 
import ast 

# see https://stackoverflow.com/questions/960733/python-creating-a-dictionary-of-lists 
vfg_cluster_map = defaultdict(list) 

# map all of the vfg... keys to their cluster numbers first 
with open(sys.argv[1], 'r') as dict_1: 
    for line in dict_1: 
     # split the line at the first space to separate the cluster number and gene ID list 
     # e.g. after splitting the line "0 ['VFG003386', 'VFG034084', 'VFG003381']", 
     # cluster_group_num holds "0", and vfg_list holds "['VFG003386', 'VFG034084', 'VFG003381']" 
     cluster_group_num, vfg_list = line.strip().split(' ', 1) 
     cluster_group_num = int(cluster_group_num) 

     # convert "['VFG...', 'VFG...']" from a string to an actual list 
     vfg_list = ast.literal_eval(vfg_list) 
     for vfg in vfg_list: 
      vfg_cluster_map[vfg].append(cluster_group_num) 

# you now have a dictionary mapping gene IDs to the clusters they 
# appear in, e.g 
# {'VFG003386': [0], 
# 'VFG034084': [0], 
# ...} 
# you can look in that dictionary to find the cluster numbers corresponding 
# to your vfg... keys in dict_2 and add them to the list for that vf_accession 
vf_accession_cluster_map = defaultdict(list) 
with open(sys.argv[2], 'r') as dict_2: 
    for line in dict_2: 
     vfg, vf_accession = line.strip().split(' ') 

     # add the list of cluster numbers corresponding to this vfg... to 
     # the list of cluster numbers corresponding to this vf_accession 
     vf_accession_cluster_map[vf_accession].extend(vfg_cluster_map[vfg]) 

for vf_accession, cluster_list in vf_accession_cluster_map.items(): 
    print vf_accession + ' ' + str(cluster_list) 

Dann das Skript speichern und rufen Sie es wie python <script name> dict1_file dict2_file > output (oder Sie können die Saiten schreiben eine Datei, anstatt sie zu drucken und weiterzuleiten).

BEARBEITEN: Nach @ BioGeek Antwort betrachten, sollte ich beachten, dass es sinnvoller wäre, dies alles auf einmal zu bearbeiten, als dict_1 und dict_2 Dateien zu erstellen, sie einzulesen, die Zeilen in Zahlen und Listen zu zerlegen, usw. Wenn Sie die Wörterbücher nicht zuerst in eine Datei schreiben müssen, können Sie einfach Ihren anderen Code zum Skript hinzufügen und die Wörterbücher direkt verwenden.

+1

Ich schätze deine Hilfe: D –

+0

Ich habe tatsächlich einen Teil deines Codes benutzt, um ein Problem zu lösen Problem von mir. Außerdem habe ich neue Dinge für die Python-Programmierung gelernt, also nochmals vielen Dank: D –

+0

Ich bin froh zu hören, dass es hilfreich war! –

Verwandte Themen