2016-12-30 123 views
0

我有不同的分類與我一個詳盡的清單:拆分Python列表並將其存儲在單獨的列表

myList = [ 
    {'name': 'Sasha', 'category': 'Dog'}, 
    {'name': 'Meow', 'category': 'Cat'}, 
    {'name': 'Bark', 'category': 'Dog'} 
] 

我希望他們能夠打破這bigList內創建更小的列表。這將是與此類似:

bigList = [ 
    [ 
    {'category': 'Dog', 'name': 'Sasha'}, 
    {'category': 'Dog', 'name': 'Bark'} 
    ], 
    [ 
    {'category': 'Cat', 'name': 'Meow'} 
    ] 
] 

這裏是迭代循環蟒蛇邏輯:

bigList = [] 
prev = '' 

for s in myList: 
     newList = [] 
     if s['category'] != prev: 
      for m in myList: 
       if m['category'] == s['category']: 
        newList.append(m) 
      bigList.append(newList) 
     prev = s['category'] 

這樣做的伎倆對我,但我想知道我怎麼能優化上述for循環中的更多更短和更高效的代碼。

+1

可能會更好地適應[代碼審查網站(http://codereview.stackexchange.com/)。 – alecxe

+0

這樣做會很快。 – xxCodexx

+0

查看'itertools',特別是['groupby'](https://docs.python.org/2/library/itertools.html#itertools.groupby) – roganjosh

回答

2

您可以用groupby兩個步驟@roganjosh作爲評論做到這一點:

from itertools import groupby 

# step 1: sort the list by category, we need this step because groupby only groups same 
# adjacent values so we need to sort the list so that same category are close to each other 
sort_list = sorted(myList, key = lambda x: x["category"]) 

# step 2: group by the category and create a new sub list for each group 
[list(g) for _, g in groupby(sort_list, key = lambda x: x['category'])] 


#[[{'category': 'Cat', 'name': 'Meow'}], 
# [{'category': 'Dog', 'name': 'Sasha'}, {'category': 'Dog', 'name': 'Bark'}]] 
1

排序可以爲大型列表昂貴。

與您的數據開始:

my_list = [ 
    {'name': 'Sasha', 'category': 'Dog'}, 
    {'name': 'Meow', 'category': 'Cat'}, 
    {'name': 'Bark', 'category': 'Dog'} 
] 

這遍歷一旦你的列表中的所有元素,並rembers什麼它已經在字典中見過:

res = [] 
seen = {} 
for entry in my_list: 
    val = seen.setdefault(entry['category'], []) 
    if not val: 
     res.append(val) 
    val.append(entry) 

它附加一個新的列表只對於還沒有看到的條目爲res,但是它從seen字典獲得的對應嵌套列表val的所有條目。所以,同樣valresseen。因此,追加到val將放大val,無論您訪問valres和或seen,都可以看到效果。行val = seen.setdefault(entry['category'], [])爲您提供一個現有列表,如果該類別在之前出現過,或者如果該類別第一次遇到,則爲一個新的空列表。同時,如果該類別尚未在seen中,它將添加一個帶有空列表的新密鑰作爲seen的值。

這是結果:

import pprint 

pprint.pprint(res) 

[[{'category': 'Dog', 'name': 'Sasha'}, {'category': 'Dog', 'name': 'Bark'}], 
[{'category': 'Cat', 'name': 'Meow'}]] 
+0

這是否適合您? –