Сортировка хэша Perl в Python

Я пытаюсь перевести строку кода Perl на Python, но у меня возникла проблема с методом sorted () Python. 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 сортирует на основе 1-го элемента в хеш-коде: один, два, три. Но версия Perl выполняет сортировку по "индексу"


person superface    schedule 17.09.2013    source источник
comment
Это может вам помочь, если вы еще этого не видели: wiki.python.org/ moin / HowTo / Sorting   -  person ermagana    schedule 17.09.2013
comment
Это также кажется связанным: stackoverflow.com/questions/3122566   -  person Brian Peterson    schedule 17.09.2013
comment
Python не имеет встроенной поддержки хеширования, как в Perl - о чем вы? dicts - это фундаментальный тип данных в Python. Вы ищете автовивификацию? Вы можете получить это с def tree(): return collections.defaultdict(tree).   -  person user2357112 supports Monica    schedule 17.09.2013


Ответы (1)


Прежде всего, ваш код 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.

person Community    schedule 17.09.2013
comment
Спасибо Lego Stormtroopr, лямбда, которую вы добавили, решила проблему. - person superface; 17.09.2013
comment
@superface Если ответ помог, выбор его в качестве принятого ответа помогает респондентам находить неотвеченные вопросы и показывать будущим посетителям, чем помог ответ. - person ; 17.09.2013