2009-08-02 17 views
12

en PHP, se puede manejar una lista de los nombres de los estados y sus abreviaturas con una matriz asociativa como esto:

<?php 
    $stateArray = array(
     "ALABAMA"=>"AL", 
     "ALASKA"=>"AK", 
     // etc... 
     "WYOMING"=>"WY" 
    ); 

    foreach ($stateArray as $stateName => $stateAbbreviation){ 
     print "The abbreviation for $stateName is $stateAbbreviation.\n\n"; 
    } 
?> 

salida (con un orden clave conservado):

The abbreviation for ALABAMA is AL. 

The abbreviation for ALASKA is AK. 

The abbreviation for WYOMING is WY. 

EDIT: Tenga en cuenta que el orden de los elementos de la matriz se conserva en la salida de la versión php. La implementación de Java, utilizando un HashMap, no garantiza el orden de los elementos. Tampoco lo hace el diccionario en Python.

¿Cómo se hace esto en Java y Python? Sólo encuentro enfoques que suministran el valor, dada la llave, como pitón de:

stateDict = { 
    "ALASKA": "AK", 
    "WYOMING": "WY", 
} 

for key in stateDict: 
    value = stateDict[key] 

EDIT: basado en las respuestas, este fue mi solución en Python,

# a list of two-tuples 
stateList = [ 
    ('ALABAMA', 'AL'), 
    ('ALASKA', 'AK'), 
    ('WISCONSIN', 'WI'), 
    ('WYOMING', 'WY'), 
] 

for name, abbreviation in stateList: 
    print name, abbreviation 

Salida:

ALABAMA AL 
ALASKA AK 
WISCONSIN WI 
WYOMING WY 

Que es exactamente lo que se requería.

+0

¿Por qué dices que PHP * "el orden de los elementos de la matriz se conserva en el resultado" *? ¿Este comportamiento ** está garantizado ** por los documentos de PHP? – Pacerier

Respuesta

32

en Python:

for key, value in stateDict.items(): # .iteritems() in Python 2.x 
    print "The abbreviation for %s is %s." % (key, value) 

en Java:

Map<String,String> stateDict; 

for (Map.Entry<String,String> e : stateDict.entrySet()) 
    System.out.println("The abbreviation for " + e.getKey() + " is " + e.getValue() + "."); 
+0

Muchas gracias por su ayuda. En cuanto a la versión de Java, doy por sentado que May.Entry está simplemente mal escrito. Puede ser realmente confuso para un principiante que clasifica el código cuando tiene incluso un pequeño error tipográfico en él. ¿Es seguro asumir que StateDict es de hecho un mapa? ¿Un HashMap? –

+0

gracias, fijo. stateDict es un mapa – newacct

+0

He editado mi pregunta para subrayar que el orden de los elementos de la matriz se conserva en el resultado de la versión de php. La implementación de Java, utilizando un Mapa, no parece garantizar el orden de los elementos. –

6

en java para el arreglo asociativo uso Mapa

import java.util.*; 

class Foo 
{ 
    public static void main(String[] args) 
    { 
     Map<String, String> stateMap = new HashMap<String, String>(); 
     stateMap.put("ALABAMA", "AL"); 
     stateMap.put("ALASKA", "AK"); 
     // ... 
     stateMap.put("WYOMING", "WY"); 

     for (Map.Entry<String, String> state : stateMap.entrySet()) { 
      System.out.printf(
       "The abbreviation for %s is %s%n", 
       state.getKey(), 
       state.getValue() 
      ); 
     } 
    } 
} 
+0

¡Gracias por el claro ejemplo! Y compila y ejecuta, hace justo lo que esperaba. Tu respuesta me ayudó a resolver la versión abreviada de newacct. Francamente, sin tu código, me habría perdido por un buen tiempo. –

+0

¡Uy !, notado después del hecho de que HashMap no conserva el orden de los elementos. ¡Pero un LinkedHashMap sí lo hace! –

+0

@ o948 gracias por este –

1

Otra forma de hacerlo en Java. Aunque ya se ha publicado una mejor forma, esta está sintácticamente más cerca de tu código php.

for (String x:stateDict.keySet()){ 
     System.out.printf("The abbreviation for %s is %s\n",x,stateDict.get(x)); 
    } 
+0

Esto se ve interesante, y funciona bien, ¡pero admito que me tomará un momento resolverlo! :) Gracias por el ejemplo. –

2

Además, para mantener el orden de inserción, puede utilizar un LinkedHashMap en lugar de un HashMap.

+0

Sí, un LinkedHashMap parece exactamente lo que necesitaba. Compilado, ejecutado, y el orden se conserva. ¡Eso es por el consejo! –

+0

Su sugerencia resolvió la versión de Java, ¿puede recomendar un reemplazo para el diccionario en la versión python de acct? Tampoco conserva el orden ... –

2

En python, ordered dictionary está disponible en Python 2.7 (aún no publicado) y Python 3.1. Se llama OrderedDict.

+0

¡Gracias por la sugerencia! Estaba empezando a pensar que mi pregunta podría quedar sin respuesta. Aunque admitiré que estoy angustiado, si es cierto que foreach de php ($ array as $ key => $ value) no se puede implementar en python. Me temo que no entiendo por qué un diccionario de claves ordenadas debe perder su orden cuando se recupera. Es desconcertante. Ahora supongo que estoy buscando una solución alternativa. –

+0

@Lasoldo Solsifa: cuando dices "un diccionario de claves ordenadas" ¿te refieres a una instancia de OrderedDict o a un dict de Python normal? Debido a que un dict normal de Python NUNCA ha ordenado claves, la especificación dice que las claves pueden ser devueltas en cualquier orden. La diferencia es que PHP realmente usa una matriz asociativa, y Python usa una tabla hash. Son similares pero no exactamente lo mismo. En Python <= 2.6, usar una lista de 2-tuples es probablemente la mejor solución. –

+0

Sin saber Python, supe primero de su próximo diccionario ordenado de la respuesta de Alexander Ljungberg a mi pregunta. Solo busco una matriz asociativa en general, desde la cual puedo recuperar mis claves en el orden en que fueron insertadas. Examinaré tu sugerencia de una lista de 2-tuplas. Gracias por la ayuda. –

2

Este es el código modificado de o948 donde se usa un TreeMap en lugar de un HashMap. El mapa de árbol conservará el orden de las teclas con la tecla.

import java.util.*; 

class Foo 
{ 
public static void main(String[] args) 
{ 
    Map<String, String> stateMap = new TreeMap<String, String>(); 
    stateMap.put("ALABAMA", "AL"); 
    stateMap.put("ALASKA", "AK"); 
    // ... 
    stateMap.put("WYOMING", "WY"); 

    for (Map.Entry<String, String> state : stateMap.entrySet()) { 
      System.out.printf(
        "The abbreviation for %s is %s%n", 
        state.getKey(), 
        state.getValue() 
      ); 
     } 
    } 
} 
+1

Gracias por la ayuda. Respuestas a mi La pregunta también indicó que un LinkedHashMap preservaría el orden de los elementos, así que me gustó, solo sustituí LinkedHashMap por HashMap. El tuyo también funciona, ¡así que ahora puedo elegir entre dos soluciones! –

+0

¡Vaya! Pilgrim señala que TreeMap clasifica los elementos por clave , mientras que LinkedHashMap conserva el orden original, que es lo que se requería. –

1

A lo largo de las líneas de la respuesta de Alexander ...

El diccionario de Python nativo no mantiene el pedido para una máxima eficiencia de su uso principal: un mapeo no ordenado de teclas a los valores.

me ocurren dos soluciones:

  1. vistazo al código fuente de OrderedDict e incluirlo en su propio programa.

  2. hacer una lista que contiene las teclas en orden:

    states = ['Alabamba', 'Alaska', ...] 
    statesd = {'Alabamba':'AL', 'Alaska':'AK', ...} 
    for k in states: 
        print "The abbreviation for %s is %s." % (k, statesd[k]) 
    
+0

La sugerencia de Daniel Pryden de una lista de dos tuplas puede ser mejor. p. [('Alabamba', 'AL'), ('Alaska', 'AK'), ...] – alberge

0

TreeMap no es una respuesta a su pregunta, ya que ordena los elementos por clave, mientras que preserva LinkedHashMap orden original. Sin embargo, TreeMap es más adecuado para el diccionario debido a la clasificación.

+0

Muchas gracias por señalar esto. Como mi lista de estados de EE. UU. Está, en su mayor parte, en orden alfabético, ¡no me di cuenta de que TreeMap estaba realmente ordenando los elementos! Lo probé y, efectivamente, no guardó el orden de inserción. A diferencia de LinkedHashMap, que sigue siendo el ganador en este caso. –

Cuestiones relacionadas