java和python相当于php';s foreach($key=>;$value作为数组)

java和python相当于php';s foreach($key=>;$value作为数组),java,php,python,associative-array,Java,Php,Python,Associative Array,在php中,可以使用如下关联数组处理状态名称及其缩写的列表: <?php $stateArray = array( "ALABAMA"=>"AL", "ALASKA"=>"AK", // etc... "WYOMING"=>"WY" ); foreach ($stateArray as $stateName => $stateAbbreviation){ pri

在php中,可以使用如下关联数组处理状态名称及其缩写的列表:

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

    foreach ($stateArray as $stateName => $stateAbbreviation){
        print "The abbreviation for $stateName is $stateAbbreviation.\n\n";
    }
?>
编辑:请注意,数组元素的顺序保留在php版本的输出中。使用HashMap的Java实现不能保证元素的顺序。Python中的字典也没有

这在java和python中是如何实现的?我只发现在给定键的情况下提供值的方法,比如python:

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

for key in stateDict:
    value = stateDict[key]

编辑:根据答案,这是我的python解决方案

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

for name, abbreviation in stateList:
    print name, abbreviation
输出:

ALABAMA AL
ALASKA AK
WISCONSIN WI
WYOMING WY
这正是需要的。

在Python中:

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

Map<String,String> stateDict;

for (Map.Entry<String,String> e : stateDict.entrySet())
    System.out.println("The abbreviation for " + e.getKey() + " is " + e.getValue() + ".");
Map stateDict;
对于(Map.Entry e:stateDict.entrySet())
System.out.println(““+e.getKey()+”的缩写是“+e.getValue()+”);

在java中用于关联数组使用映射

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()
            );
        }
    }
}
import java.util.*;
福班
{
公共静态void main(字符串[]args)
{
Map stateMap=newhashmap();
州地图。put(“阿拉巴马州”、“阿尔卑斯州”);
州地图。放置(“阿拉斯加”、“AK”);
// ...
州地图。放置(“怀俄明州”、“怀俄明州”);
对于(Map.Entry状态:stateMap.entrySet()){
System.out.printf(
“%s的缩写为%s%n”,
state.getKey(),
state.getValue()
);
}
}
}

另一种在Java中实现的方法。虽然已经发布了一个更好的方法,但是这个方法在语法上更接近您的php代码

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

另外,为了保持插入顺序,可以使用LinkedHashMap而不是HashMap。

在python中,python 2.7(尚未发布)和python 3.1中提供了一个。它被称为OrderedDict。

这是o948中修改过的代码,在这里您使用树映射而不是哈希映射。树映射将按键保留键的顺序

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()
            );
      }
    }
 }
import java.util.*;
福班
{
公共静态void main(字符串[]args)
{
Map stateMap=newtreemap();
州地图。put(“阿拉巴马州”、“阿尔卑斯州”);
州地图。放置(“阿拉斯加”、“AK”);
// ...
州地图。放置(“怀俄明州”、“怀俄明州”);
对于(Map.Entry状态:stateMap.entrySet()){
System.out.printf(
“%s的缩写为%s%n”,
state.getKey(),
state.getValue()
);
}
}
}

按照亚历山大的回答

本机python字典并没有为其主要用途的最大效率维护排序:键到值的无序映射

我可以想出两个变通办法:

  • 查看OrderedDict的源代码,并将其包含在您自己的程序中

  • 列出一个按顺序保存键的列表:

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


  • TreeMap并不能回答您的问题,因为它按键对元素进行排序,而LinkedHashMap保留原始顺序。不过,由于排序的原因,TreeMap更适合于词典。

    非常感谢您的帮助。关于Java版本,我想当然地认为May.Entry只是拼写错误。对于一个整理代码的新手来说,即使有一个小的打字错误,也会让人感到困惑。假设stateDict实际上是一张地图,安全吗?HashMap?thanx,已修复。stateDict是一个映射如果需要保持元素的顺序,请使用
    LinkedHashMap
    。谢谢CD1的建议。同时,使用字典的python版本也不保留顺序。有什么想法吗?:)根据定义,Python指令是无序的。如果您想要python中的有序数据,请查看列表或其他数据结构。感谢提供清晰的示例!它编译并运行,正是我所期望的。你的回答帮助我整理出newacct的速记版本。坦白地说,如果没有你的代码,我会迷路很长一段时间。哎呀,注意到HashMap没有保留元素的顺序。但LinkedHashMap确实如此!这看起来很有趣,运行也很好,但我承认我需要一点时间来整理它!:)谢谢你的例子。是的,LinkedHashMap看起来正是我需要的。编译、运行并保留顺序。那是小费!你的建议解决了Java版本的问题,你能推荐一个替代品来替换acct的python版本中的字典吗?它也不能维持秩序…谢谢你的提示!我开始觉得我的问题可能没有答案。不过,如果php的foreach($array as$key=>$value)确实不能在python中实现,我承认我很苦恼。恐怕我不明白为什么有序键字典在检索时一定会失去顺序。这令人困惑。现在我想我正在寻找解决办法。@Lasoldo Solsifa:当你说“有序键词典”时,你是指有序的dict实例还是普通的Python dict?因为一个普通的Python dict从来没有对键进行过排序——规范中说键可以按任何顺序返回。不同之处在于PHP实际上使用关联数组,而Python使用哈希表。它们很相似,但并不完全相同。在《不懂Python的Python》一书中,我从Alexander Ljungberg对我的问题的回答中了解到了即将出版的有序词典。我只是在寻找一个关联数组,从中我可以按照插入键的顺序检索键。我将研究你关于2元组列表的建议。谢谢你的帮助。我想标准字典不是因为性能原因订购的。使用字典最常用的方法不是逐项检查,而是在需要时查找个别项目。如果您只想按字母顺序显示字典,则可以使用“for key,value in(key,stateDict[key]for key in sorted(stateDict.keys()):”谢谢你的帮助。对我问题的回答还表明LinkedHashMap会保留元素顺序,所以我喜欢你,只是我用LinkedHashMap代替了HashMap。你的也可以,所以现在我可以在两种解决方案中选择!哎呀。Pilgrim指出了树映射