如何解决通过 str 列表对对象列表进行分组的 Pythonic 方法
我有一个数据类,例如
from dataclasses import dataclass
from typing import List
@dataclass
class Place:
name: str
tags: List[str]
和一个对象列表:
places = [Place(name='Foo',tags=['tagA','tagB']),Place(name='Bar',tags=['tagB','tagC']),...]
如果我想按标签对 10000x 个对象进行分组,例如
{
'tagA': [Place(name='Foo','tagB'])],'tagB': [Place(name='Foo','tagC'])],'tagC': [Place(name='Bar','tagC'])]
}
一种方法是遍历列表,然后遍历标签列表并构建字典。
但是有没有更好的方法来做到这一点?也许使用 itertools.groupby
解决方法
sess = tf.compat.v1.Session(reuse=reuse,...)
model = load_gpt2(sess,...)
仅在以下情况下有用/有效:
- 您可以对您的输入应用排序,以便一个组的所有预期成员都是相邻的,并且
- 任何项目都不应属于多个组。
您描述的用例违反了这两个标准(每个项目都属于与它有标签一样多的组,没有合理的排序顺序可以对它们进行分组),因此 itertools.groupby
是不合适的。正确的解决方案是您描述的解决方案;创建一个 itertools.groupby
(或者为了方便起见,一个 dict
以避免需要进行成员资格测试和/或 collections.defaultdict(list)
调用),迭代所有对象,将它们添加到所有适当的键中,例如:
setdefault
这是尽可能有效的;每个地点/标签对只迭代一次,而 from collections import defaultdict
places = ...
places_by_tag = defaultdict(list)
for place in places:
for tag in place.tags:
places_by_tag[tag].append(place)
查找,虽然技术上最坏的情况 dict
,是平均情况 O(n)
。唯一有意义的优化是,如果标签可以轻松转换为固定大小的 O(1)
索引,将平均情况 list
减少到 实际 O(1)
,但这不太可能重要(试图对其进行改进是过早的优化)。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。