2016-09-30 3 views
0

Учитывая два списка разной длины, но в основном с аналогичными (или перекрывающимися) значениями, такие как:Заполнение нулей в список в определенных позициях

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 с нулями, чтобы списки соответствовали длине?

EDIT: Я пытаюсь найти способ сделать списки одинаковой точной длины, поместив нули, где они находятся , скорее всего, можно найти. Вероятность здесь определяется как измеренное расстояние между пунктом [i] в ​​списке 1 и пунктом [i] в ​​списке 2.

Note1: Я понимаю, что проблема не определена. Полезный ответ, например, указал бы мне на метод сравнения элементов в списках и нахождение вероятного порога.

Note2: Списки всегда сортируются, производительность не является большой проблемой.

Пример: вставить два нуля между значениями 69 и 81, а также еще некоторыми другими нулями между 330 и 391.

Моим подхода до сих пор было вычисляя разницу между значениями, и когда difference > some_treshold, я бы a 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. 

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

Дайте мне знать, если все это имеет смысл или есть более простые способы обойти это. (И если было бы более целесообразно публиковать два отдельных вопроса).

+0

Всегда ли отсортированы списки входных данных? Нужен ли порядок, включая нули в середине списка? Или вам нужны нули, чтобы занять место в списке? – pferate

+0

Первый шаг: придумайте точную формулировку проблемы и предполагаемое решение. Вы не можете вводить точность, пока не определите, что вы подразумеваете под «отсутствием». – brianpck

+0

Спасибо за отзыв. Я отредактирую вопрос. –

ответ

0
ls_2.insert(ls_2.index(81), 0) 

вставит нуля до значения 81, просто повторите и у вас есть два нуля. Загрузите результат ls_2.index(81) в переменной, чтобы немного ускорить работу.

+0

Это пример игрушки. Мне нужно решение для более крупных списков и для их множества. Выполнение этого вручную не поможет. –

+0

На боковой ноте увеличение порога до 5 также выполняет ту же работу по добавлению нуля между 69 и 81 @ Anthon. –

0

Пойдите, добавив 0s в конце вашего 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) 

Для второй части Вашего вопроса. Если вы хотите сравнить два списка с переменным размером, почему вы хотите, чтобы эти два списка имели одинаковый размер?

Надеюсь, это поможет.

+0

1. Я ищу, чтобы найти эвклидовое расстояние между векторами, поэтому мне нужно заполнить места, где они не совпадают. Если я добавлю нули в конце, то формула евклидова расстояния не будет работать. –

+0

2. Эвклидовое расстояние или расстояние от косинуса требуют, чтобы векторы имели одинаковую длину –

 Смежные вопросы

  • Нет связанных вопросов^_^