2014-03-13 29 views
1

你知道更好/更快地解決了這個名單更高效/時尚代碼,數據結構

['foo1:bar1', 'foo2:bar2', 'foo3:bar3'] 

轉換成以下字典

{'col2': ['bar1', 'bar2', 'bar3'], 'col1': ['foo1', 'foo2', 'foo3']} 

當前版本似乎有點怪異的轉換和可能因爲兩個循環而變慢。

tuples = ['foo1:bar1', 'foo2:bar2', 'foo3:bar3'] 
tuples_separated = [one.split(':') for one in tuples] 
tidied = {'col1': [], 'col2': []} 
for one in tuples_separated: 
    tidied['col1'].append(one[0]) 
    tidied['col2'].append(one[1]) 

回答

6

使用zip來壓縮項目?

In [15]: d={} 
    ...: vals=zip(*(i.split(':') for i in tuples)) 
    ...: d['col1'], d['col2']=vals 
    ...: print d 
{'col2': ('bar1', 'bar2', 'bar3'), 'col1': ('foo1', 'foo2', 'foo3')} 
+0

非常好,謝謝。 'vals'對於稍微改變的賦值是沒有必要的:(split ['col1'],split ['col2'])= zip(*(tuple.split(':')爲元組中的元組)) –

+1

@tmaier yes它似乎更好一點,更新;) – zhangxaochen

2

你可以使用:

dict(zip(('col1', 'col2'), 
    zip(*[item.split(':') for item in x]))) 

In [93]: x = ['foo1:bar1', 'foo2:bar2', 'foo3:bar3'] 

In [94]: [item.split(':') for item in x] 
Out[94]: [['foo1', 'bar1'], ['foo2', 'bar2'], ['foo3', 'bar3']] 

In [95]: zip(*[item.split(':') for item in x]) 
Out[95]: [('foo1', 'foo2', 'foo3'), ('bar1', 'bar2', 'bar3')] 

In [96]: dict(zip(('col1', 'col2'), zip(*[item.split(':') for item in x]))) 
Out[96]: {'col1': ('foo1', 'foo2', 'foo3'), 'col2': ('bar1', 'bar2', 'bar3')} 
2

你也可以試試這個,這適用於列的任意數:

>>> tuples = ['foo1:bar1', 'foo2:bar2', 'foo3:bar3'] 
>>> 
>>> {'col'+str(i+1):t for i,t in enumerate(zip(*(s.split(':') for s in tuples)))} 
{'col2': ('bar1', 'bar2', 'bar3'), 'col1': ('foo1', 'foo2', 'foo3')}