#python #sorting #padding
#python #сортировка #заполнение
Вопрос:
Даны два списка разной длины, но с в основном похожими (или перекрывающимися) значениями, такими как:
ls_1 = [7, 26, 26, 55, 69, 71, 73, 80, 121, 124, 126, 127,
131, 133, 144, 153, 153, 159, 160, 210, 219, 221,
235, 235, 241, 243, 289, 299, 300, 309, 327, 327,
328, 391, 419, 421, 423, 433]
ls_2 = [7, 28, 28, 60, 69, 81, 121, 124, 125, 127, 131, 133,
144, 153, 153, 159, 160, 210, 219, 221, 235, 235, 241,
243, 327, 327, 330, 391, 419, 421, 423, 433]
Есть ли простой способ дополнить «отсутствующие» значения в списке 2 нулями, чтобы списки совпадали по длине?
РЕДАКТИРОВАТЬ: я пытаюсь найти способ сделать так, чтобы списки имели одинаковую точную длину, поместив нули там, где они, скорее всего, будут найдены. Вероятность здесь подразумевается как измеренное расстояние между элементом [i] в списке 1 и элементом [i] в списке 2.
Примечание1: я понимаю, что проблема не является четко определенной. Например, полезный ответ мог бы указать мне на метод сравнения элементов в списках и определения вероятного порога.
Примечание2: Списки всегда сортируются, производительность не является большой проблемой.
Пример: вставьте два нуля между значениями 69 и 81 и еще несколько других нулей между 330 и 391.
До сих пор мой подход заключался в вычислении разницы между значениями и когда difference > some_treshold
, я бы сделал ls_2.insert
.
Однако это, по-видимому, не самый надежный метод, поскольку он требует произвольного порога.
for i in range(len(ls_2)):
distance = ls_2[i] - ls_1[i]
if distance > 3:
ls_2.insert(i, 0)
print(len(ls_2), len(ls_1)) #double-checking, lengths are the same.
Я задаю этот вопрос специально, потому что это приводит к другому вопросу: как сравнивать списки целых чисел разного размера. Я имею в виду, что выполнение описанного здесь заполнения позволит мне реализовать более простые алгоритмы, такие как cos distance и euclidean distance. Самая конечная цель — заполнить большое количество списков и ранжировать их по сходству со справочным списком целых чисел.
Дайте мне знать, имеет ли все это смысл или есть более простые способы сделать это. (И если было бы более уместно опубликовать два отдельных вопроса).
Комментарии:
1. Всегда ли сортируются входные списки? Нужно ли поддерживать порядок, включая нули в середине списка? Или вам просто нужно, чтобы нули занимали место в списке?
2. Первый шаг: придумайте точную формулировку проблемы и предполагаемого решения. Вы не можете ввести точность, пока не определите точно, что вы подразумеваете под «отсутствием».
3. Спасибо за отзыв. Я отредактирую вопрос.
Ответ №1:
ls_2.insert(ls_2.index(81), 0)
перед значением будет вставлен ноль 81
, просто повторите, и у вас будут ваши два нуля. Кэшируйте результат ls_2.index(81)
в переменной, чтобы немного ускорить процесс.
Комментарии:
1. Это игрушечный пример. Мне нужно решение для больших списков и для множества из них. Выполнение этого вручную не сильно поможет.
2. Кстати, увеличение порога до 5 также выполняет ту же работу по добавлению нуля между 69 и 81 @Anthon.
Ответ №2:
Сделайте это, добавив 0 в конце вашего ls_2
. Не между ними, как вы указали. Это значительно снижает сложность.
Что-то вроде:
ls_1_length = len(ls_1)
ls_2_length = len(ls_2)
length_diff = ls_1_length - ls_2_length
for index in length_diff:
ls_2.append(0)
Для второй части вашего вопроса. Если вы хотите сравнить два списка переменного размера, почему вы хотите сделать эти два списка одинакового размера?
Надеюсь, это поможет.
Комментарии:
1. 1. Я ищу, чтобы найти евклидово расстояние между векторами, поэтому мне нужно заполнить места, где они не совпадают. Если я добавлю нули в конце, формула евклидова расстояния работать не будет.
2. 2. Евклидово расстояние или косинусное расстояние требуют, чтобы векторы были одинаковой длины