Это:
socks, pairs = Counter(map(int,input().strip().split())), 0
означает:
(socks, pairs) = (Counter(map(int,input().strip().split())), 0)
Это как если бы вы написали:
socks = Counter(map(int,input().strip().split()))
pairs = 0
Разница в том, что правая сторона полностью оценена до назначения, но это не имеет значения здесь
Но размеры кортежей должны совпадать. Когда вы опускаете ,0
, оно становится:
(socks, pairs) = (Counter(map(int,input().strip().split())), )
Как видите, размеры не совпадают. Это то, что вызывает проблему.
Вы НЕ должны ожидать, что ключи или значения в обычном Dictionary
, которые должны поддерживаться в любом порядке.В SortedDictionary
ключи и значения поддерживаются в порядке значения ключа - это не то же самое, что и порядок вставки .
Единственный встроенный словарь в платформе .NET, который сохраняет порядок вставки, - это System.Collections.Specialized.OrderedDictionary
. К сожалению, этот класс не является универсальным, однако написать для него универсальную оболочку не так уж и сложно. Имейте в виду, что при работе с типами значений (например, int
или double
) это приведет к блокированию ключей / значений (общие словари не накладывают блокировку на типы значений).
Как отметил @Anton, Dictionary<TKey,TValue>
- неупорядоченная коллекция. Правильный возврат ваших значений является совпадением и в конечном итоге потерпит неудачу. Если вам нужна заказанная хеш-таблица, вы должны использовать SortedDictionary<TKey,TValue>
В любом случае, полагайтесь на Dictionary<TKey, TValue>
, чтобы сохранить порядок!
Хотя Dictionary<TKey, TValue>
ясно заявляет, что порядок перечисления не определен, мы проверили, что он действительно сохраняет порядок вставки (по крайней мере, до тех пор, пока вы не удаляйте предметы из него). Если кто-то может предоставить тест, который опровергает его, мы были бы очень заинтересованы, поскольку наш производственный код опирается на него.
Вы можете использовать тот же подход и сэкономить немного усилий, а своему клиенту - немного денег.
Конечно, Microsoft может изменить реализацию словаря в будущей версии .NET, но если это произойдет, ваш автоматический тест обнаружит его, и вы сможете заменить словарь другим контейнером в это время, верно?