2014-10-29 15 views
2

我有串名單如下:Python的 - 我怎麼能分割字符串列表,以獲得獨特的分裂在原來的順序

diabo_faves = [ 
    {"Description": "Local-Standard-Office"}, 
    {"Description": "Local-Standard-Extended}, 
    {"Description": "Local-Standard-247"}, 
    {"Description": "Direct-Standard-Office"}, 
    {"Description": "Direct-Standard-Extended"}, 
    {"Description": "Direct-Standard-247"}, 
    {"Description": "Premium-Standard-Office"}, 
    {"Description": "Premium-Standard-Extended"}, 
    {"Description": "Premium-Standard-247"}, 
]; 

,我想從中得到以下結果在JSON(保持順序):

Filters: [ 
    [ 
    "Local", 
    "Direct", 
    "Premium" 
    ], 
    [ 
    "Standard" 
    ], 
    [  
    "Office", 
    "Extended", 
    "247" 
    ] 
] 

然而,當我用這個方法:

def get_filters(self, favorites, seperator = "-", ignores = []): 

    favorites = self.prepare(favorites, ignores) 

    steps = [] 
    for fave in favorites: 

     filters = fave.split(seperator) 

     for index, filter in enumerate(filters): 

      try: 
       steps[index].add(filter) 
      except IndexError: 
       steps.append(set([filter])) 

    return [list(step) for step in steps] 

我得到的結果不正確的順序一樣此:

Filters: [ 
[ 
    "Premium", 
    "Local", 
    "Direct" 
    ], 
    [ 
    "Standard" 
    ], 
    [  
    "247", 
    "Extended", 
    "Office" 
    ] 
] 

如何更改我的方法以保持指定的原始順序? 「本地」, 「直接」, 「頂級」 等。

+0

'prepare()'做了什麼? – GreenAsJade 2014-10-29 04:56:14

回答

1

可以使用collections.OrderedDictitertools.izip做到這一點:

from collections import OrderedDict 
from itertools import izip 

splitted_values = izip(*(x['Description'].split('-') for x in diabo_faves)) 
print [list(OrderedDict.fromkeys(x)) for x in splitted_values] 
#[['Local', 'Direct', 'Premium'], ['Standard'], ['Office', 'Extended', '247']] 

這裏splitted_values包含了所有的列值:

[ 
('Local', 'Local', 'Local', 'Direct', 'Direct', 'Direct', 'Premium', 'Premium', 'Premium'), 
('Standard', 'Standard', 'Standard', 'Standard', 'Standard', 'Standard', 'Standard', 'Standard', 'Standard'), 
('Office', 'Extended', '247', 'Office', 'Extended', '247', 'Office', 'Extended', '247') 
] 

然後我們將其中的每一個傳遞給OrderedDict.fromkeys,以便只按照他們首先看到的順序獲取唯一項目。如果OrderedDict不適用於您(在Python 2.7中引入),那麼您可以使用itertoools中的unique_everseen recipe