我正在尝试将一行Perl代码翻译成Python,但我遇到了Python的sorted()方法的障碍。 Python没有像Perl那样的本机哈希支持,所以我使用autodict()来复制Perl的哈希行为。以下是有关如何完成排序的代码段。
的Perl:
hash{one}{"index"} = 1
hash{one}{"value"} = "uno"
hash{two}{"index"} = 2
hash{two}{"value"} = "dos"
hash{three}{"index"} = 3
hash{three}{"value"} = "tres"
foreach my $ctg (sort hash{$a}{"index"} <=> hash{$b}{"index"}} keys %{ hash })
的Python:
hash[one]["index"] = 1
hash[one]["value"] = "uno"
hash[two]["index"] = 2
hash[two]["value"] = "dos"
hash[three]["index"] = 3
hash[three]["value"] = "tres"
for ctg in sorted(hash):
上述翻译并不完全正确。 Python版本基于散列中的第一个元素排序,即一,二,三。但是Perl版本正在基于“索引”进行排序
答案 0 :(得分:2)
首先,你的Python代码没有运行:hash
没有定义,键需要是字符串,除非你在其他地方定义了它们。
这可能更接近你想要的,但是,我无法理解最后一行中的Perl。
hash = {}
hash['one'] = {"index": 1, "value": "uno"}
hash['two'] = {"index": 2, "value": "dos"}
hash['three']= {"index": 3, "value": "tres"}
for ctg in sorted(hash.keys(),key=lambda x: hash[x]['index']):
print hash[ctg]['index'],hash[ctg]['value']
此代码返回:
1 uno
2 dos
3 tres
在sorted()
函数中,我们可以定义一个key
来表示我们希望它如何排序。在你的情况下,它被按键排序,因为这是一个迭代器上的迭代器返回的东西,但是我们已经明确地声明了对dict键的排序,然后是基于该dict中的值的排序键。