Как можно выдержать сравнение, до какой степени два списка находятся в том же порядке?

Попробуйте

data=[]

while len(data) < 2:

   name = raw_input("Please enter your name: ")
   age = int(raw_input("Please enter your age: "))
   height = int(raw_input("Please enter your height: "))

   data.append({
      'name': name,
      'age': age,
      'height': height,
  })

print data

Это потому, что вы вводите name вместо указания информации о пользователе (имя, возраст, рост).

7
задан Machavity 28 January 2019 в 00:23
поделиться

7 ответов

Среднее квадратичное различий индексов каждого элемента.

List 1: A B C D E
List 2: A D C B E

Индексы каждого элемента Списка 1 в Списке 2 (базирующийся нуль)

A B C D E
0 3 2 1 4

Индексы каждого элемента Списка 1 в Списке 1 (базирующийся нуль)

A B C D E
0 1 2 3 4

Различия:

A  B C D E
0 -2 0 2 0

Квадрат различий:

A B C D E
  4   4

Средняя особенность = 8 / 5.

12
ответ дан 6 December 2019 в 12:56
поделиться

Просто идея, но там какой-либо пробег в адаптации стандартного алгоритма сортировки для подсчета, количество операций подкачки должно было преобразовать list1 в list2?

Я думаю, что определение сравнить функция может быть трудным хотя (возможно, даже столь же трудный как исходная проблема!), и это может быть неэффективно.

править: думая об этом немного больше, сравнить функция была бы по существу определена самим целевым списком. Так, например, если список 2:

1 4 6 5 3

... затем сравнить функция должна привести к 1 <4 <6 <5 <3 (и равенство возврата, где записи равны).

Затем функция подкачки просто должна быть расширена для подсчета операций подкачки.

2
ответ дан 6 December 2019 в 12:56
поделиться

Вы могли бы рассмотреть, сколько изменений вносит для преобразования одной строки в другого (который я предполагаю, что это были Вы, достигали, когда Вы упомянули расстояние редактирования).

См.: http://en.wikipedia.org/wiki/Levenshtein_distance

Хотя я не думаю, что l-расстояние принимает во внимание вращение. Если Вы позволяете вращение как операцию затем:

1, 2, 3, 4

и

2, 3, 4, 1

Довольно подобны.

1
ответ дан 6 December 2019 в 12:56
поделиться

Существует алгоритм метода ветвей и границ, который должен работать на любой набор операторов, которые Вы любите. Это не может быть очень быстро. Псевдокод проходит примерно так:

bool bounded_recursive_compare_routine(int* a, int* b, int level, int bound){
    if (level > bound) return false;
    // if at end of a and b, return true
    // apply rule 0, like no-change
    if (*a == *b){
        bounded_recursive_compare_routine(a+1, b+1, level+0, bound);
        // if it returns true, return true;
    }
    // if can apply rule 1, like rotation, to b, try that and recur
    bounded_recursive_compare_routine(a+1, b+1, level+cost_of_rotation, bound);
    // if it returns true, return true;
    ...
    return false;
}

int get_minimum_cost(int* a, int* b){
    int bound;
    for (bound=0; ; bound++){
        if (bounded_recursive_compare_routine(a, b, 0, bound)) break;
    }
    return bound;
}

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

Добавленный: Это может быть расширено для нахождения ближайшей соответствующей строки сохраненной в trie. Я сделал это несколько лет назад в алгоритме исправления орфографических ошибок.

0
ответ дан 6 December 2019 в 12:56
поделиться

Я не уверен точно, какую формулу это использует под капотом, но difflib.SequenceMatcher.ratio() делает точно это:

ratio(self) method of difflib.SequenceMatcher instance:
    Return a measure of the sequences' similarity (float in [0,1]).

Пример кода:

from difflib import SequenceMatcher
sm = SequenceMatcher(None, '1234', '1324')
print sm.ratio()

>>> 0.75
0
ответ дан 6 December 2019 в 12:56
поделиться

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

# extend class array by new method
class Array
  def dist(other)
    raise 'can calculate distance only to array with same length' if length != other.length
    # initialize count of inversions to 0
    count = 0
    # loop over all pairs of indices i, j with i<j
    length.times do |i|
      (i+1).upto(length) do |j|
        # increase count if i-th and j-th element have different order
        count += 1 if (self[i] <=> self[j]) != (other[i] <=> other[j])
      end
    end
    return count
  end
end
l1 = [1, 2, 3, 4]
l2 = [1, 3, 2, 4]
# try an example (prints 1)
puts l1.dist(l2)

Расстояние между двумя массивами длины n может быть между 0 (они - то же) и n* (n+1)/2 (инвертирование первого массива, каждый получает второе). Если Вы предпочитаете иметь расстояния всегда между 0 и 1, чтобы смочь сравнить расстояния пар массивов другой длины, просто разделиться на n* (n+1)/2.

Недостаток этого алгоритмы является этим время выполнения n^2. Это также предполагает, что массивы не имеют двойных записей, но это могло быть адаптировано.

Комментарий о строке кода "рассчитывает + = 1 если...": количество увеличено, только если или i-th элемент первого списка меньше, чем его j-th элемент и i-th элемент второго списка больше, чем его j-th элемент или наоборот (подразумевать, что i-th элемент первого списка больше, чем его j-th элемент и i-th элемент второго списка меньше, чем его j-th элемент). Короче говоря: (l1 [я] <l1[j] и l2 [я]> l2[j]) или (l1 [я]> l1[j] и l2 [я] <l2[j])

0
ответ дан 6 December 2019 в 12:56
поделиться

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

Интересно, что jamesh, похоже, получил аналогичную меру, но не нормализованную.

См. этот недавний ответ SO ].

1
ответ дан 6 December 2019 в 12:56
поделиться
Другие вопросы по тегам:

Похожие вопросы: