在多个列表的筛选列表中拆分python列表并将它们存储在单个列表中

时间:2016-12-30 15:36:17

标签: python django list for-loop

我有一份与我不同类别的详尽清单:

<img src="http://placehold.it/55/55" 
     style="width: 100%; max-height: 100%" 
     onload=" var maxHeight = this.naturalHeight; console.log(maxHeight)">

我希望它们在这个bigList中打破并创建一个更小的列表。它类似于:

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

这是迭代循环的python逻辑:

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

这对我来说已经成功了,但我想知道如何在for循环中优化上述逻辑以获得更短更有效的代码。

2 个答案:

答案 0 :(得分: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 :(得分:1)

对于大型列表,排序可能很昂贵。

从您的数据开始:

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

这会循环遍历列表中的所有元素,并在字典中记住它之前已经看到的内容:

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

它仅为尚未看到的res条目添加新列表,但是从val字典中获取相应嵌套列表seen的所有条目。因此,同一val位于resseen中。因此,只要您valval和/或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'}]] 的值。

结果如下:

localhost:80/index.php