Вычисление расстояний между элементами в круговом массиве

#python #arrays #circular-buffer #circular-list

#python #массивы #циклический буфер #циклический список

Вопрос:

 people = ["James","COP","George","COP","Sam","Mac","Johnny","Karina"]

cops = [(idx 1) for idx, val in enumerate(people) if val == "COP"]  #cops' positions
peoplePositions = [(x 1) for x in range(len(people))] #index positions
distances = []
for x in peoplePositions:
    for y in cops:
        distances.append(abs(x-y))

#the output would be "Johnny" 
  

Привет, ребята! Я работаю над этим вопросом, и в основном у меня есть список с некоторыми людьми / объектами, который на самом деле является круговой таблицей, т. Е. Его Голова связана с хвостом. Теперь я хочу взять расстояние (позиций индекса) между «полицейскими» и людьми, а затем вывести, кто получил максимальное расстояние от «полицейских». В случае, если все они получили одинаковое расстояние, на выходе должны быть все они.

Это мой код, и в итоге я получил расстояния между всеми людьми и «полицейскими». Я думал о создании вложенного цикла по расстояниям с диапазоном len (peoplePositions) и диапазоном len (cops), но у меня не было никакого прогресса.

Комментарии:

1. Что такое peoplePositions ?

2. Это позиции индекса людей.

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

4. о, извините! Я просто неправильно щелкнул код. Теперь это правильно.

5. Кроме того, я не понимаю заключительный комментарий the output would be "Johnny" . В этом коде нет операторов печати, поэтому вывода нет. Откуда вы ожидаете, что «Джонни» придет?

Ответ №1:

Вам нужно вычислить минимальное расстояние от каждого человека до каждого COP . Это можно вычислить как:

 min((p - c) % l, (c - p) % l)
  

где p индекс человека, c индекс COP и l длина массива. Затем вы можете вычислить минимальное из этих расстояний, чтобы получить минимальное расстояние от человека до любого из COP s. Затем вы можете вычислить максимальное из этих значений и отфильтровать people массив на основе их расстояния, равного максимальному:

 people = ["James","COP","George","COP","Sam","Mac","Johnny","Karina"]
cops = [idx for idx, val in enumerate(people) if val == "COP"]
l = len(people)
distances = [min(min((p - c) % l, (c - p) % l) for c in cops) for p in range(l)]
maxd = max(distances)
pmax = [p for i, p in enumerate(people) if distances[i] == maxd]
print(pmax)
  

Вывод:

 ['Johnny']