Давайте посмотрим
d[t].append(c)
, Каково значение [1 110]? Попробуйте его.
d = {}
t = 0
d[t]
, Что Вы получаете? О. Нет ничего в [1 111], который имеет ключ [1 112].
Теперь попытка это.
d[t] = []
d[t]
Ahh. Теперь существует что-то в [1 113] с ключом [1 114].
существует несколько вещей, которые можно сделать.
setdefault
. d.setdefault(t,[]).append(c)
. defaultdict(list)
вместо простого словаря, {}
. Редактирование 1. Оптимизация
Данный входные строки из файла в вышеупомянутой форме: ts, x, y, процесс группировки бесполезен. Нет никакой причины пойти из простого списка (ts, x, y) к более сложному списку (ts, (x, y), (x, y), (x, y)...). Исходный список может быть обработан точно, когда он прибыл.
d= collections.defaultdict(list)
for ts, x, y in someFileOrListOrQueryOrWhatever:
d[ts].append( (x,y) )
Редактирование 2. Ответьте на Вопрос
"при инициализации словаря, необходимо ли сказать словарь, на что будет похожа структура данных в виде пар "ключ-значение"?"
я не уверен, что означает вопрос. С тех пор все словари структуры значения ключа, вопрос, не очень ясный. Так, я рассмотрю эти три альтернативы, которые могут ответить на вопрос.
Пример 2 .
Инициализация
d= {}
Использование
if t not in d:
d[t] = list()
d[t].append( c )
Каждое значение словаря должно быть инициализировано к некоторой полезной структуре. В этом случае мы проверяем, чтобы видеть, присутствует ли ключ; когда ключ отсутствует, мы создаем ключ и присваиваем пустой список.
инициализация Setdefault
d= {}
Использование
d.setdefault(t,list()).append( c )
В этом случае, мы используем setdefault
метод, чтобы или выбрать значение, связанное с ключом или создать новую стоимость, связанную с недостающим ключом.
инициализация dict
по умолчанию
import collections
d = collections.defaultdict(list)
Использование
d[t].append( c )
defaultdict
использование инициализатор функционируют для недостающих ключей. В этом случае мы обеспечиваем эти list
функция так, чтобы новый, пустой список был создан для недостающего ключа.
попробуйте следующую формулу:
360-(|a-b|)%360<x || (|a-b|)%360<x
Или в PHP :
<?php
$b = 10;
$angle1 = -179;
$angle2 = 180;
$diff = $angle1 - $angle2;
if(abs($diff % 360) <= $b || (360-abs($diff % 360))<=$b) {
echo "yes";
} else {
echo "no";
}
?>
Вы также можете использовать скалярное произведение:
cos(a)*cos(b) + sin(a)*sin(b) >= cos(x)
Как справедливо указывает Марсель, по модулю отрицательных чисел потенциально проблематично. Кроме того, в чем разница между 355 и 5 градусами? Возможно, это будет 350 градусов, но люди, вероятно, ожидают 10 градусов. Мы делаем следующие предположения:
0 <= diff <= 180
; 2 * PI
; -360 , где x - входной угол, а
Входные данные: углы a и b. Таким образом, алгоритм прост:
0 <= x <360
; Для первого шага, чтобы преобразовать угол в желаемый диапазон, есть две возможности:
x> = 0
: normal = x% 360 x <0
: normal = (-x / 360 + 1) * 360 + x Второй предназначен для устранения любой неоднозначности в интерпретации операций отрицательного модуля. Итак, чтобы дать рабочий пример для x = -400:
-x / 360 + 1
= -(-400) / 360 + 1
= 400 / 360 + 1
= 1 + 1
= 2
, затем
normal = 2 * 360 + (-400)
= 320
, поэтому для входов 10 и -400 нормальные углы равны 10 и 320.
Теперь мы вычисляем кратчайший угол между ними. Для проверки работоспособности сумма этих двух углов должна составлять 360. В этом случае возможные варианты равны 50 и 310 (нарисуйте это, и вы увидите это). Чтобы решить эти проблемы:
normal1 = min(normal(a), normal(b))
normal2 = max(normal(a), normal(b))
angle1 = normal2 - normal1
angle2 = 360 + normal1 - normal2
Итак, для нашего примера:
normal1 = min(320, 10) = 10
normal2 = max(320, 10) = 320
angle1 = normal2 - normal1 = 320 - 10 = 310
angle2 = 360 + normal1 - normal2 = 360 + 10 - 320 = 50
You '
Для радиуса 1 расстояние между конечными точками линии равно 2sin ((ab / 2). Так что отбросьте 2, поскольку вас интересует только сравнение, и сравните sin (x / 2) на sin ((ab) / 2). Триггерные функции заботятся обо всем обертывании.