【发布时间】:2013-12-30 08:15:06
【问题描述】:
Perl 有一个构造(如 Joe Z 所指出的,称为“散列切片”)用于使用列表索引散列以获得列表,例如:
%bleah = (1 => 'a', 2 => 'b', 3 => 'c');
print join(' ', @bleah{1, 3}), "\n";
执行给:
a c
我知道在 Python 中处理这个问题的最简单、最易读的方法是列表推导:
>>> bleah = {1: 'a', 2: 'b', 3: 'c'}
>>> print ' '.join([bleah[n] for n in [1, 3]])
a c
因为:
>>> bleah[[1, 2]]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'list'
还有其他更好的方法吗?也许在 Python3 中,我还没有做太多?如果没有,有谁知道是否已经为此提交了 PEP?我的 google-fu 找不到。
“它不是 Pythonic”:是的,我知道,但我希望它是。它是简洁易读的,并且由于它永远不会是 Pythonic 来索引具有不可哈希类型的 dict,因此让异常处理程序为您迭代索引而不是 barfing 不会破坏大多数当前代码.
注意:正如 cmets 中所指出的,这个测试用例可以重写为一个列表,完全避免使用 dict,但我正在寻找一个通用的解决方案。
【问题讨论】:
-
顺便说一句,上面使用的 Perl 功能的名称是“hash slice”。
-
用列表代替字典怎么样?
-
在这种情况下我可以,但这只是一个说明性的测试用例。
-
我认为这样的事情会很好,但结果应该是什么?值或项目列表?一个子字典?我认为使用
bleah.items([1,3])返回[('1','a'),('3','c')]或bleah.values([1,3])返回['a', 'c']应该更好 -
我不知道是否有任何答案考虑过这一点,但在 Perl 中,哈希切片是左值。例如,您可以像这样在哈希中分配键“a”和“c”:
@hash{"a", "c"} = split "|", "foo|bar"
标签: python perl dictionary hash