Quiero hacer el equivalente de un dictado de Python en R. Básicamente, en Python tengo:
visited = {}
if atom_count not in visited:
Do stuff
visited[atom_count] = 1
La idea es, si vi ese atom_count específico, he visitado [atom_count] = 1. Por lo tanto, si veo ese atom_count de nuevo, no "Do Stuff". Atom_Count es un número entero.
¡Gracias!
python
r
dictionary
usuario1357015
fuente
fuente
hash
con sus funciones de acceso casi similares a las de Python.Respuestas:
Lo más parecido a un dictado de Python en R es simplemente una lista. Como la mayoría de los tipos de datos R, las listas pueden tener un atributo de nombres que puede permitir que las listas actúen como un conjunto de pares nombre-valor:
> l <- list(a = 1,b = "foo",c = 1:5) > l $a [1] 1 $b [1] "foo" $c [1] 1 2 3 4 5 > l[['c']] [1] 1 2 3 4 5 > l[['b']] [1] "foo"
Ahora para el descargo de responsabilidad habitual: no son exactamente lo mismo; Habrá diferencias. Por lo tanto, estará invitando a la decepción al intentar usar literalmente listas exactamente de la forma en que podría usar un dictado en Python.
fuente
l$names(l)[1]
obviamente falla. tampoco he podido irl[which()]
al trabajofor
bucle, que es una especie de opción en casi todos los idiomas, existelapply
. También hay cosas relacionadas con diferente sintaxis, comoMap
, y un paquete completo, purrr para muchas cosas de programación funcional.l[[names(l)[1]]
debería funcionar. De todos modos, puedes iterar así:l[[1]]
sin usar los nombres. Observe que los corchetes simples[]
devolverán una lista, mientras que los corchetes dobles[[]]
devolverán el objeto dentro de la lista.names(list) <- vector_of names
, misiones con subjuegos funciona tan bien,names(list)[1] <- "foo"
. Vea tambiénsetNames()
.Creo que el uso de una tabla hash (crear un nuevo entorno) puede ser la solución a su problema. Escribiría cómo hacer esto, pero lo hice ayer en talkstats.com.
Si su diccionario es grande y solo tiene dos columnas, este puede ser el camino a seguir. Aquí está el enlace al hilo de talkstats con código R de muestra:
ENLACE DE TABLA HASH
fuente
data.table
Las búsquedas de vectores con nombre de Note y R han mejorado drásticamente en velocidad desde este momento.Si, como en su caso, solo desea que su "diccionario" almacene valores del mismo tipo, simplemente puede usar un vector y nombrar cada elemento.
> l <- c(a = 1, b = 7, f = 2) > l a b f 1 7 2
Si desea acceder a las "claves", utilice
names
.> names(l) [1] "a" "b" "f"
fuente