Индексирование значений float в Python

У меня есть список поплавков, сгенерированных из структуры данных, которая представляет собой список словарей, т. Е. Я повторил весь список и выбран для определенных значений в данном словаре. Теперь я хочу сделать что-то с этими точками данных, для чего мне нужна ссылка на исходную позицию. Я попытался просто использовать точку данных в качестве ключа, но после попытки и неудачи я сделал некоторые рытье и понял, что поплавки не точно представлены из-за того, как работают компьютеры.

Итак, мне нужен способ присвоить уникальное значение каждому словарю в списке, например:

list = [...] vallist = [] index = {} for i in range(0, len(list)): value = i+0.123 vallist.append(value) index[value] = i 

Кроме того, я, очевидно, должен назначить каждому значению уникальный элемент, чтобы иметь возможность указать на их позицию в объекте списка. Я предполагаю, что могу создать новый объект, называемый «valuelist» или что-то еще, а затем int над этим, но это похоже на то, что, вероятно, имеет очевидное обходное решение, которое я просто слишком толстый, чтобы понять.

Чтобы повторить, я хочу, чтобы вернуть значения в исходное положение в списке – в моей структуре данных мой список содержит тонну словарей, и способ, которым я его обрабатываю, несколько сложнее, m вид застрял с моей, возможно, непрактичной структурой.

Благодаря!

2 Solutions collect form web for “Индексирование значений float в Python”

Во-первых, давайте рассмотрим проблемы, связанные с использованием плавающей запятой.

Поплавки не точно представлены из-за того, как работают компьютеры.

Числа с плавающей запятой точно представлены в компьютерах. Существуют, однако, некоторые ограничения:

  • Разрешение конечно. Невозможно представить иррациональное число в конечной памяти, а типичные плавающие точки могут представлять только пару десятков цифр.
  • Некоторые десятичные числа (base10) не имеют точного представления в двоичном формате . Например, 0,1 не может быть точно представлено в базе 2. Запуск "{0:.20f}".format(0.1) в python вернет 0.10000000000000000555 .

Теперь, в зависимости от источника ваших номеров и вида вычислений, которые вы хотите выполнить, существуют различные возможные варианты их индексирования.

Для чисел, которые можно точно описать в базе 10, вы можете использовать Decimal . Это точно соответствует цифрам в base10:

 >>> from decimal import Decimal >>> "{0:.20f}".format(Decimal('0.1')) '0.10000000000000000000' 

Если вы имеете дело исключительно с рациональными числами (даже без точного десятичного представления), вы можете использовать фракции .

Обратите внимание: если вы используете десятичные числа или дроби, вам нужно будет использовать их как можно скорее в своей обработке. Преобразование из поплавка в десятичную / дробную часть на поздних этапах поражает их цель – вы не можете получить данные, которых нет:

 >>> "{0:.20f}".format(Decimal('0.1')) '0.10000000000000000000' >>> "{0:.20f}".format(Decimal(0.1)) '0.10000000000000000555' 

Кроме того, использование десятичных знаков или дробей будет иметь существенное снижение производительности. Для серьезного хрустания числа вы всегда будете использовать float или даже целые числа на своем месте

Наконец, если ваши номера иррациональны, или если вы получаете индексирование неудач даже при использовании десятичных знаков или фракций, ваш лучший выбор, вероятно, индексирует округленные версии чисел. При необходимости используйте ведра . collections.defaultdict может быть полезен для этого.

Вы также можете сохранить дерево или использовать двоичный поиск по списку с помощью специальной функции сравнения, но у вас не будет поиска O(1)

Если я правильно понял, вы создали список поплавков, каждый из которых из одного из dicts в исходном списке. Вместо того, чтобы генерировать список поплавков, почему бы не сгенерировать список из 2-х кортежей, будучи float, и это соответствующий индекс словаря-списка …

  • Как получить значение значения в качестве ключа словаря
  • Значения Float как словарный ключ
  • Словарь лучшей структуры данных для поездов?
  • Рекурсивно заменить символы в словаре
  • heapq с обычным предикатом сравнения
  • Функция «.format» python
  • python СинтаксисError с dict (1 = ...), но {1: ...} работает
  • Сортировка по ключу словаря внутри словаря в Python
  • Python - лучший язык программирования в мире.