2017-02-09 34 views
0

我有一个看起来像这样的元组列表;Python将这个列表元组变成字典的最快方法是什么?

li = [('Replicate 1', '_E748_.txt'), 
     ('Replicate 1', '_E749_.txt'), 
     ('Replicate 2', '_E758_.txt'), 
     ('Replicate 2', '_E759_.txt')] 

什么是创建一个看起来像这样的字典的最快方法;

{'Replicate1': ['_E748_.txt', '_E749_.txt'], 
'Replicate2': ['_E758_.txt', '_E759_.txt']} 
+2

你尝试过什么吗? –

回答

4

鉴于

>>> li = [('Replicate 1', '_E748_.txt'), 
...  ('Replicate 1', '_E749_.txt'), 
...  ('Replicate 2', '_E758_.txt'), 
...  ('Replicate 2', '_E759_.txt')] 

>>> d = {} 
>>> for k, v in li: 
...  d.setdefault(k, []).append(v) 
... 
>>> d 
{'Replicate 2': ['_E758_.txt', '_E759_.txt'], 'Replicate 1': ['_E748_.txt', '_E749_.txt']} 

或者

>>> from collections import defaultdict 
>>> d2 = defaultdict(list) 
>>> for k, v in li: 
...  d2[k].append(v) 
... 
>>> d2 
defaultdict(<type 'list'>, {'Replicate 2': ['_E758_.txt', '_E759_.txt'], 'Replicate 1': ['_E748_.txt', '_E749_.txt']}) 

甚至过于花哨

>>> from itertools import groupby 
>>> from operator import itemgetter 
>>> get0, get1 = itemgetter(0), itemgetter(1) 
>>> dict((key, list(map(get1, subit))) for key, subit in groupby(sorted(li), get0)) 
{'Replicate 2': ['_E758_.txt', '_E759_.txt'], 'Replicate 1': ['_E748_.txt', '_E749_.txt']} 
+0

谢谢!我不知道'.setdefault'是一件事情。多么好的优雅的解决方案。它使我写的循环看起来很荒谬。 –

+1

@JamesDraper:如果'.setdefault()'不存在,你可以做类似'如果k不在d:d [k] = [v]''else:d [k] .append(v)'中。 –

相关问题