Без замены это может быть записано непосредственно в более Pythonic понимании:
output = [[dv, f2, dk] for f1, f2 in f for dk, dv in d.items() if dv == f1]
На простом английском языке: создать список, состоящий из списков dv, f2, dk
, где f2
является вторым значением кортежи (f1, f2)
в f
и где dk
и dv
являются ключом и значением элементов dk: dv
из d
, когда значение dv
совпадает со значением f1
.
Или как полностью функциональный скрипт:
f = [('str1', 7.0), ('str2', 2.8), ('str3', 11.2)]
d = {'aa': 'str2', 'bb': 'str3', 'cc': 'str1'}
desired_output = [['str1', 7.0, 'cc'], ['str2', 2.8, 'aa'], ['str3', 11.2, 'bb']]
output = [[dv, f2, dk] for f1, f2 in f for dk, dv in d.items() if dv == f1]
print(output == desired_output)
Я сделал быстрый ненаучный тест в режиме Release. Я использовал два исходных данные: "2.34523" и "badinput" в оба метода и выполненный с помощью итераций 1,000,000 раз.
Допустимый вход:
Double.TryParse = 646ms
Convert.ToDouble = 662 ms
Не очень отличающийся, как ожидалось. Во всех отношениях, для допустимого входа, это то же.
Недопустимый вход:
Double.TryParse = 612ms
Convert.ToDouble = ..
Хорошо.. это работало в течение долгого времени. Я повторно выполнил всю вещь с помощью 1 000 повторений, и Convert.ToDouble
с плохим входом занял 8,3 секунд. Составляя в среднем его, он принял бы 2 часа. Я не забочусь, насколько основной тест в недопустимом входном случае, Convert.ToDouble
, исключение, повышающее, разрушит Вашу производительность.
Так, вот другое голосование за TryParse
с некоторыми числами для поддержки его.
Прежде всего, я использовал бы double.Parse
, а не Convert.ToDouble
во-первых.
относительно того, необходимо ли использовать Parse
или TryParse
: можно ли продолжить двигаться, если существуют плохие входные данные, или это - действительно исключительное условие? Если это исключительно, используйте Parse
и позвольте ему аварийно завершиться, если вход плох. Если это ожидается и может быть чисто обработано, используйте TryParse
.
Руководство по проектированию Платформы.NET рекомендует использовать методы Попытки. Предотвращение исключений обычно является хорошей идеей.
Convert.ToDouble(object)
сделает ((IConvertible) object).ToDouble(null);
, Который будет звонить Convert.ToDouble(string, null)
, Таким образом, это будет быстрее для вызова строковой версии.
Однако строковая версия просто делает это:
if (value == null)
{
return 0.0;
}
return double.Parse(value, NumberStyles.Float | NumberStyles.AllowThousands, provider);
, Таким образом, это быстрее, чтобы сделать double.Parse
непосредственно.
Я обычно стараюсь избегать Convert
класс (значение: Я не использую его), потому что я нахожу это очень сбивающим с толку: код дает слишком мало подсказок на том, что точно происходит здесь, с тех пор Convert
позволяет большому количеству семантически совсем других преобразований происходить с тем же кодом. Это мешает управлять для программиста, что точно происходит.
Мой совет, поэтому, никогда не состоит в том, чтобы использовать этот класс. Это не действительно необходимо ни один (за исключением двоичного форматирования числа, потому что нормальное ToString
метод классов числа не предлагает соответствующий метод, чтобы сделать это).
Если Вы не собираетесь быть обрабатывающим исключения, идут с TryParse. TryParse быстрее, потому что он не должен иметь дело с целым отслеживанием стека исключительной ситуации.
Я всегда предпочитал использовать TryParse()
методы, потому что это собирается плюнуть назад успешностью или неуспешностью для преобразования, не имея необходимость волноваться об исключениях.
Дважды. TryParse IMO.
для Вас легче обработать, Вы будете знать точно, где ошибка произошла.
Тогда можно иметь дело с ним, как Вы считаете целесообразным, возвращает ли это false (т.е. не мог бы преобразовать).
Лично, я нахожу TryParse
метод легче читать, какой, который Вы на самом деле захотите использовать, зависит от Вашего примера использования: если ошибки могут быть обработаны локально, Вы ожидаете ошибки, и bool от TryParse
хорош, еще Вы могли бы хотеть просто позволить исключениям полететь.
я ожидал бы TryParse
быть быстрее также, так как это избегает издержек обработки исключений. Но используйте инструмент сравнительного теста, как MiniBench Jon Skeet для сравнения различных возможностей.