我有一份与我不同类别的详尽清单:
<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循环中优化上述逻辑以获得更短更有效的代码。
答案 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
位于res
和seen
中。因此,只要您val
到val
和/或val
,res
附加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