2016-07-26 5 views
2

Ich verwende Python2.7. Ich habe eine Datei, die einen Chromosomenort und eine Experiment-ID enthält. Ich habe diese Informationen zur Zeit in zwei Listen gespeichert bekam:Erstellen Sie ein Wörterbuch, das Listen zugeordnet ist, und aktualisieren Sie dies über eine Schleife

unique_locations - containing a single value for each location 
location_exp - containing lists of [location, experiment] 

Der Grund, warum ich nicht ein Wörterbuch verwendet haben, ist, dass es mehrere Standorte in mehreren Experimenten gefunden - das heißt das eine viele-viele-Beziehung ist.

Ich möchte herausfinden, wie viele Experimente jeder Standort gefunden wird. D.h erhalten eine Liste wie:

[ 
    [location1, [experiment1, experiment2, experiment3]], 
    [location2, [experiment2, experiment3, experiment4]] 
                  ] 

usw.

Da die Längen der Listen unterscheiden Ich habe auf beiden Listen eine Aufzählung (Liste) Schleife fehlgeschlagen verwenden. Ich habe es versucht:

location_experiment_sorted = [] 
for i, item in enumerate(unique_experiment): 
    location = item[0] 
    exp = item[1] 
    if location not in location_experiment_sorted: 
     location_experiment_sorted.append([location, exp]) 
    else: 
     location_experiment_sorted[i].append(exp) 

Unter anderem. Ich habe auch versucht, ein Wörterbuch zu verwenden, das sich auf eine Liste mehrerer Experimente bezieht. Kann mir jemand in die richtige Richtung zeigen?

+0

Ich glaube, Sie können Ihre 'location_exp' Liste einfach sortieren und dann mit [' itertools.groupby'] (https://docs.python.org/2/library/itertools.html#itertools.groupby). Nicht sicher, ob ich die Situation richtig verstanden habe. –

Antwort

2

Wenn ich Sie richtig verstanden (wenn Standorte können als dict Schlüssel verwendet werden)

Sie tun können:

location_experiments={} 
for location, experiment in location_exp: 
    location_experiments.setdefault(location,[]).append(experiment) 
1

Ich habe dies nicht ausgeführt, so entschuldigen, wenn es fehlschlägt. , wenn Sie sagen, es ist eine Liste von Listen wie [[location, Experiment], [Ort, Experiment]] dann:

locationList = {} 
for item in unique_experiment: 
    location = item[0] 
    exp = item[1] 
    if location not in locationList: 
     locationList[location] = [] 
     locationList[location].append(exp) 
    else: 
     locationList[location].append(exp) 
+0

das hat perfekt funktioniert danke! – trouselife

2

Try defaultdict, das heißt:

from collections import defaultdict 

unique_locations = ["location1", "location2"] 
location_exp = [ 
    ("location1", "experiment1"), 
    ("location1", "experiment2"), 
    ("location1", "experiment3"), 
    ("location2", "experiment2"), 
    ("location2", "experiment3"), 
    ("location2", "experiment4") 
] 

location_experiment_dict = defaultdict(list) 
for location, exp in location_exp: 
    location_experiment_dict[location].append(exp) 

print(location_experiment_dict) 

druckt-out:

defaultdict(<type 'list'>, { 
    'location2': ['experiment2', 'experiment3', 'experiment4'], 
    'location1': ['experiment1', 'experiment2', 'experiment3'] 
}) 
1

Hier ist ein weiteres Ausführungsbeispiel ist, integrierte sich mit der dict und groupby von itertools:

>>> from itertools import groupby 
>>> d = {} 
>>> location_exp = [ 
    ("location1", "experiment1"), 
    ("location1", "experiment2"), 
    ("location1", "experiment3"), 
    ("location2", "experiment2"), 
    ("location2", "experiment3"), 
    ("location2", "experiment4") 
] 
>>> for k,v in groupby(location_exp, itemgetter(0)): 
     d.setdefault(k,[]) 
     d[k].extend([loc for _, loc in v]) 


[] 
[] 
>>> d 
{'location2': ['experiment2', 'experiment3', 'experiment4'], 'location1': ['experiment1', 'experiment2', 'experiment3']} 
>>> 
>>> d2 = {} 
>>> location_exp2 = [ 
    ("location1", "experiment1"), 
    ("location2", "experiment2"), 
    ("location3", "experiment3"), 
    ("location1", "experiment2"), 
    ("location2", "experiment3"), 
    ("location3", "experiment4") 
] 
>>> for k,v in groupby(location_exp2, itemgetter(0)): 
     d2.setdefault(k,[]) 
     d2[k].extend([loc for _, loc in v]) 


[] 
[] 
[] 
['experiment1'] 
['experiment2'] 
['experiment3'] 
>>> d2 
{'location2': ['experiment2', 'experiment3'], 'location1': ['experiment1', 'experiment2'], 'location3': ['experiment3', 'experiment4']} 
Verwandte Themen