【问题标题】:java and python equivalent of php's foreach($array as $key => $value)java 和 python 相当于 php 的 foreach($array as $key => $value)
【发布时间】:2010-11-16 05:08:23
【问题描述】:

在 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";
    }
?>

输出(保留键顺序):

The abbreviation for ALABAMA is AL.

The abbreviation for ALASKA is AK.

The abbreviation for WYOMING is WY.

编辑:请注意,数组元素的顺序保留在 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

这正是我们所需要的。

【问题讨论】:

  • 为什么说PHP的“在输出中保留了数组元素的顺序”? PHP 文档是否保证这种行为?

标签: java php python associative-array


【解决方案1】:

在 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() + ".");

【讨论】:

  • 非常感谢您的帮助。关于 Java 版本,我理所当然地认为 May.Entry 只是拼写错误。当代码中有一个小的错字时,对于一个新手来说,它可能会让人很困惑。假设 stateDict 实际上是 Map 是否安全? HashMap?
  • 谢谢,已修复。 stateDict 是一个地图
  • 如果您需要保持元素的顺序,请使用LinkedHashMap
  • 感谢 CD1 的建议。同时,使用字典的 python 版本也不保留顺序。有任何想法吗? :)
  • Python dicts,根据定义,是无序的。如果要在 python 中排序数据,请查看列表或其他数据结构。
【解决方案2】:

在java中用于关联数组使用Map

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()
            );
        }
    }
}

【讨论】:

  • 感谢您提供的清晰示例!它编译并运行,完全符合我的预期。您的回答帮助我整理了 newacct 的速记版本。坦率地说,如果没有你的代码,我可能已经迷失了很长时间。
  • 糟糕,在 HashMap 不保留元素顺序这一事实之后注意到了这一点。但是 LinkedHashMap 可以!
【解决方案3】:

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

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

【讨论】:

  • 这看起来很有趣,而且运行良好,但我承认我需要一点时间来整理它! :) 谢谢你的例子。
【解决方案4】:

另外,为了维护插入顺序,您可以使用 LinkedHashMap 代替 HashMap。

【讨论】:

  • 是的,LinkedHashMap 看起来正是我所需要的。编译,运行,并保留顺序。这是给小费的!
  • 你的建议解决了Java版本,你能推荐一个替换acct的python版本的字典吗?它也不保持秩序......
【解决方案5】:

在 Python 中,ordered dictionary 在 Python 2.7(尚未发布)和 Python 3.1 中可用。它被称为 OrderedDict。

【讨论】:

  • 感谢您的提示!我开始认为我的问题可能没有答案。不过,我承认我很苦恼,如果 php 的 foreach($array as $key => $value) 确实不能在 python 中实现。恐怕我不明白为什么有序键的字典在检索时必须丢失其顺序。这很令人困惑。现在我想我正在寻找解决方法。
  • @Lasoldo Solsifa:当您说“有序键的字典”时,您是指 OrderedDict 实例还是普通的 Python 字典?因为普通的 Python dict 从来没有有序的键——规范说键可以按任何顺序返回。不同之处在于 PHP 实际上使用关联数组,而 Python 使用哈希表。它们相似但不完全相同。在 Python
  • 不知道 python,我首先从 Alexander Ljungberg 对我的问题的回答中知道了它即将推出的有序字典。我只是在寻找一个关联数组,我可以按照插入的顺序从中检索我的键。我将研究您对 2 元组列表的建议。感谢您的帮助。
  • 由于我想象的性能原因,标准字典没有排序。使用字典的最常见方法不是逐项检查,而是在需要时查找单个项目。如果您只想按字母顺序显示字典,您可以使用“for key, value in (key, stateDict[key] for key in sorted(stateDict.keys()):”
【解决方案6】:

这是 o948 修改后的代码,您使用 TreeMap 而不是 HashMap。 Tree map 将按键保持键的顺序。

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()
            );
      }
    }
 }

【讨论】:

  • 感谢您的帮助。我的问题的答案还表明 LinkedHashMap 会保留元素顺序,所以我确实喜欢你,只是我用 LinkedHashMap 代替了 HashMap。你的也可以,所以现在我可以在两种解决方案之间进行选择!
  • 糟糕。 Pilgrim 指出,TreeMap 按键排序元素,而 LinkedHashMap 保留原始顺序,这是需要的。
【解决方案7】:

按照亚历山大的回答...

本机 Python 字典不维护其主要用途的最大效率的顺序:键到值的无序映射。

我可以想到两种解决方法:

  1. 查看 OrderedDict 的源代码,并将其包含在自己的程序中。

  2. 制作一个按顺序保存键的列表:

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

【讨论】:

  • Daniel Pryden 对二元组列表的建议可能更好。例如[('Alabamba', 'AL'), ('Alaska', 'AK'), ...]
【解决方案8】:

TreeMap 不是您问题的答案,因为它按键对元素进行排序,而 LinkedHashMap 保留原始顺序。但是,TreeMap 更适合字典,因为它是排序的。

【讨论】:

  • 非常感谢您指出这一点。由于我的美国州列表大部分是按字母顺序排列的,我没有注意到 TreeMap 实际上是在对元素进行排序!我对其进行了测试,果然,它没有保留插入顺序。与 LinkedHashMap 不同,在这种情况下它仍然是赢家。
猜你喜欢
  • 2011-08-16
  • 2011-03-19
  • 2013-08-31
  • 2013-12-31
  • 2022-01-05
  • 2011-04-16
  • 1970-01-01
  • 1970-01-01
  • 2011-07-12
相关资源
最近更新 更多