2016-12-30 4 views
0

に格納するには、私は私と一緒にさまざまなカテゴリの完全なリストを持っています。それはこのようになります。ここスプリットPythonの複数のリストのフィルタリングされたリスト内のリストおよび単一のリスト

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

は、ループの反復のためのpythonのロジックです:

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ループのロジック。

@roganjoshによってコメントとしてあなたが groupbyと二段階でこれを行うことができます
+1

は、おそらくより良い[コードレビューサイト](http://codereview.stackexchange.com/)をフィットします。 – alecxe

+0

すぐにやります。 – xxCodexx

+0

'itertools'、特に[' groupby']を見てください(https://docs.python.org/2/library/itertools.html#itertools.groupby) – roganjosh

答えて

2

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

これは機能しますか? –

関連する問題