gpt4 book ai didi

perl - 我应该如何在迭代时删除哈希元素?

转载 作者:行者123 更新时间:2023-12-03 22:26:12 25 4
gpt4 key购买 nike

我有相当大的散列(大约 1000 万个键),我想从中删除一些元素。

我平时不喜欢用deletesplice ,我最终复制了我想要的东西,而不是删除我不想要的东西。但这一次,由于hash真的很大,我想我想直接从中删除。

所以我正在做这样的事情:

foreach my $key (keys %hash) {
if (should_be_deleted($key)) {
delete($hash{$key});
}
}

它似乎工作正常。但是.. 如果我想在迭代之前删除一些元素怎么办?我将举例说明:
foreach my $key (keys %hash) {
if (should_be_deleted($key)) {
delete($hash{$key});
# if $key should be deleted, so does "$key.a", "kkk.$key" and some other keys
# I already know to calculate. I would like to delete them now...
}
}

我想到了一些可能的解决方案 - 比如检查一个键是否仍然存在作为循环的第一步或第一次循环并创建一个要删除的键列表(而不实际删除它们),然后在另一个循环中实际删除。

您对此有何看法?

更新

似乎双通方法有一个共识。但是,从某种意义上说,这是非常低效的,因为在第一遍期间,我会仔细检查已标记为删除的键。这有点递归,因为我不仅检查了 key ,还计算了其他应该删除的 key ,尽管它们已经由原始 key 计算出来了。

也许我需要使用一些更动态的数据结构来迭代键,这将动态更新?

最佳答案

我建议做两遍,因为它更健壮。哈希顺序实际上是随机的,因此无法保证您会在相关键之前看到“主”键。例如,如果 should_be_deleted()只检测不需要的主键并计算相关的主键,您最终可能会处理不需要的数据。两遍方法避免了这个问题。

my @unwanted;
foreach my $key (keys %hash) {
if (should_be_deleted($key)) {
push @unwanted, $key;
# push any related keys onto @unwanted
}
}

delete @hash{@unwanted};

foreach my $key (keys %hash) {
# do something
}

关于perl - 我应该如何在迭代时删除哈希元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3989182/

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