2016-07-26 43 views
2

我正在使用python2.7。我有一个包含染色体位置和实验ID的文件。我有存储在时刻两个列表这样的信息:创建一个与列表关联的字典并通过一个循环更新它

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

我没有用字典的原因是,有多个实验中发现多个地点 - 即这是一个多对多的关系。

我想知道每个位置的实验数量。即得到这样的列表:

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

由于列表的长度是不同的我一直在使用上对于列的枚举(列表)循环失败。我曾尝试:

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) 

其中包括其他事情。我也尝试使用与多个实验列表相关的字典。任何人都可以将我指向正确的方向吗?

+0

我想你可以简单地对你的'location_exp'列表进行排序,然后使用['itertools.groupby'](https://docs.python.org/2/library/itertools.html#itertools.groupby)。不知道我是否正确理解了这种情况。 –

回答

2

如果我明白你正确 (如果位置可以作为字典键)

你可以这样做:

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

我还没有遇到这个,所以道歉,如果它失败。 如果你说这就像一个列表的列表[位置,实验],[位置,实验]然后:

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

这工作完全谢谢你! – trouselife

2

尝试defaultdict,即:

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) 

将打印出:

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

这里是另一个工作例如,使用内置dictgroupbyitertools

>>> 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']} 
相关问题