Python: поиск по индексу по сортировке. Но добавление «ключа» к каждому элементу прервет поиск (так как элемент не будет в списке) - PullRequest
0 голосов
/ 17 января 2020

Я не очень хорош в предоставлении "полезной" информации, поэтому, если вы знаете ответ на вопрос "Вопрос", нет необходимости читать дальше.

Вопрос

Я помещаю большое количество (повторяющихся) элементов в один список, а затем сортирую список и изменяю элементы (одинаковые элементы = одинаковое число) , Но набор разных предметов может иметь одинаковую маркировку, поскольку они поступают из одного источника:

Представьте, что вы наливаете масло и воду в горшок из двух чашек, но масло и вода были вместе в обе чашки, не разделенные. Масло и вода будут (через некоторое время) разделяться, но содержимое чашек будет смешиваться. Теперь, как вы можете вернуть масло и воду обратно в каждую чашку, в то время как каждая капля из чашки № 1 / № 2 должна вернуться обратно в чашку № 1 / № 2?

На что я пытаюсь указать является то, что сортировка прервет ссылку на исходный элемент, если моя ссылка была «порядок, в котором элементы выливаются в список»

Одним из решений может быть добавление ключа непосредственно к элементу и сортировка по ключ (в конце, лямбда-функцией), но во время кода я использую метод «list.index (...)», который возвращает неверное (или несуществующее) значение с добавленным ключом.

Поэтому я ищу способ, который будет производить вывод, который позволил бы мне быстро возвращать каждое значение обратно ключу. Спасибо за ваш ответ!

Введение :

Моя программа основана на графике, представленном списком, а края представлены одним списком из «предыдущего». "и один список" следующих "элементов, соответствующих каждому элементу.

Например:

  1. file / list # 1 - data - содержит элемент [A, B, C] по индексу 50, [A, B, B] по индексу 40 и [A, B, D] по индексу 60.
  2. file / list # 2 - previous - содержит [40, ...] в index 50.
  3. file / list # 3 - next - содержит [60, ...] в index 50.

Это означает, что [A, B, B] (# 40) связан с [A, B, C] (# 50), который связан с [A, B, D] (# 60). Моя проблема - создание списков № 2 и № 3. Мой план состоит в том, чтобы сделать «шаг», изменив один из элементов (только один) в вершинах, а затем найти индекс новой вершины. Например: [A, B, C] будет иметь «следующих соседей»: [[B, B, B], [A, C, C], [A, B, D]]. Список # 3 будет тогда содержать 3 значения, и эти значения являются индексами этих 3 подсписков.

Задача

Список очень длинный. Функция «list.index (element)» занимала большую часть времени. Итак, я узнал об эффективности использования параметра «start» и написал следующее:

vertices = list of new 'vertices' connected with the currently inspected element
vertices.sort() #the original elements are in alphabetical order, so the resulting indices will be sorted as well
indxlist = []
ind = 0
for j in vertices:
    ind = origlist.index(j,ind)
    indxlist.append(ind)
return indxlist

Что делает эта функция, так это то, что она сначала сортирует результирующие вершины ([[A, B, A], [A , A, A]] -> [[A, A, A], [A, B, A]]) - именно так упорядочиваются все вершины / элементы в файле № 1 (ориглист).

Это позволяет мне искать индексы в порядке возрастания (что означает, что я go буду проходить по всем элементам в файле # 1 max один раз).

Это немного ускорило код, но каждую вершину имеет относительно небольшое количество ребер (по сравнению с общим количеством). Поэтому я бы попытался применить этот код сразу ко всей программе (не только к повторяющейся вершине). Часть сортировки будет приводить к тому же списку, что и # 1, но элементы будут скопированы (неизвестно и разное количество раз). Затем индексирующая часть преобразует весь список в список (снова) повторяющихся чисел. Я считаю, что эта функция индексации была бы намного быстрее.

Проблема очевидна: как я могу связать индексы с соответствующими строками в файле # 2 или # 3?

...