gpt4 book ai didi

Python Set Comprehension嵌套在Dict Comprehension中

转载 作者:太空宇宙 更新时间:2023-11-03 12:43:49 25 4
gpt4 key购买 nike

我有一个元组列表,其中每个 tuple 包含一个 string 和一个数字,形式为:

[(string_1, num_a), (string_2, num_b), ...]

字符串是非唯一的,数字也是如此,例如(string_1 , num_m)(string_9 , num_b) 很可能存在于列表中。

我正在尝试创建一个字典,以该字符串为键,以该字符串出现的一组所有数字为值:

dict = {string_1: {num_a, num_m}, string_2: {num_b}, ...}

我已经通过以下带有嵌套集理解的字典理解成功地做到了这一点:

#st_id_list = [(string_1, num_a), ...]
#st_dict = {string_1: {num_a, num_m}, ...}
st_dict = {
st[0]: set(
st_[1]
for st_ in st_id_list
if st_[0] == st[0]
)
for st in st_id_list
}

只有一个问题:st_id_list 有 18,000 个项目。这段代码运行一个包含 500 个元组的列表需要不到 10 秒,但运行完整的 18,000 个元组需要超过 12 分钟。我不得不认为这是因为我在 dict comprehension 中嵌套了一个 set comprehension。

有没有办法避免这种情况,或者更聪明的方法?

最佳答案

你有一个双循环,所以你需要 O(N**2) 时间来生成你的字典。对于 500 个项目,需要执行 250.000 步,对于 18k 个项目,需要完成 324 百万 步。

这里是一个 O(N) 循环,所以对于较小的数据集,500 步,对于较大的数据集,18.000 步:

st_dict = {}
for st, id in st_id_list:
st_dict.setdefault(st, set()).add(id)

这使用了 dict.setdefault() method确保对于给定的键(您的字符串值),如果键丢失,至少有一个空集可用,然后将当前 id 值添加到该集。

您可以对 collections.defaultdict() object 执行相同的操作:

from collections import defaultdict

st_dict = defaultdict(set)
for st, id in st_id_list:
st_dict[st].add(id)

defaultdict() 使用传入的工厂为丢失的键设置默认值。

defaultdict 方法的缺点是对象继续 在循环后为丢失的键生成默认值,这可能会隐藏应用程序错误。使用 st_dict.default_factory = None 明确禁用工厂以防止这种情况发生。

关于Python Set Comprehension嵌套在Dict Comprehension中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47273509/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com