R哈希-基于值获取密钥

问题描述 投票:0回答:3
H = hash()
H[["numbers"]] = c(1,2,3)
H[["alpha"]] = c("x","y","z")
H[["animals"]] = c("cat","dog")

现在我想使用“猫”来获取“动物”。根据值获取哈希的键。

r hash
3个回答
0
投票

我不确定如何遍历hash,但是如果将哈希转换为列表,这将变得很容易。

search <- 'cat'
H1 <- as.list(H)

Filter(function(x) any(search == x), H1)

#$animals
#[1] "cat" "dog"

获得名称:

names(Filter(function(x) any(search == x), H1))
#[1] "animals"

[其他替代方法:

names(H1)[sapply(H1, function(x) any(search == x))]
names(purrr::keep(H1, ~any(search == .x)))
names(purrr::discard(H1, ~all(search != .x)))

数据

library(hash)
H = hash()
H[["numbers"]] = c(1,2,3)
H[["alpha"]] = c("x","y","z")
H[["animals"]] = c("cat","dog")

0
投票

除非我没有记错,否则哈希表旨在提供对values keys的快速/高效查找,而不是相反。

一种相反的方法[是遍历所有键以找到值并从那里开始:

v <- NULL for (k in ls(envir = H)) if ("cat" %in% H[[k]]) v <- k v # [1] "animals" H[[v]] # [1] "cat" "dog"
而高速缓存未命中将看起来像:

v <- NULL for (k in ls(envir = H)) if ("kangaroo" %in% H[[k]]) v <- k v # NULL

但是,如果您想要

有效

,我会认为(1)您将增加复杂性,并且(2)所有写入的速度都会降低。这实际上将具有两个哈希表,一个将键映射到值,另一个将每个值匹配到键。与此相关的一个问题是,在哈希表中,具有多个键引用的值是完全合法的,但是没有完美的反向逻辑:虽然指向所有候选键是可行的,但没有1-to -1关系。

0
投票
我认为您正在寻找hash::invert

invert(H)[["cat"]] [1] "animals"

这也适用于具有相同值的多个哈希。

H[["mammals"]] = c("cat","dog","human") invert(H)[["cat"]] [1] "animals" "mammals"

话虽如此,我同意其他答案,认为这是执行任务的低效率方式。
© www.soinside.com 2019 - 2024. All rights reserved.