Я совершенно новичок в Python и, пробуя различные случайные фрагменты, натолкнулся на проблему, которую, как мне кажется, я "решил", но код не не чувствует себя правильным -Я сильно подозреваю, что будет лучший способ получить желаемый результат.
К вашему сведению - я использую любую последнюю версию Python 3 для Windows.
Определение проблемы
Вкратце, я делаю сортировку списка пар таким образом, чтобы пары, содержащие элементы, отображаемые в наименьшем количестве пар, были отсортированы вперед.
Пары находятся в форме[i,j]
с 0 <= i <= j < n
, где n
- известное максимальное значение для элементов.В списке нет повторяющихся пар.
Количество элементов i
представляет собой простое число пар (не парных элементов) в формах [i,j]
, [j,i]
и * 1019.* где j
- любое значение, которое приводит к действительной паре.
В отсортированном результате пара [i,j]
должна появляться перед парой [k,l]
, если count(i) < count(k)
или count(i) == count(k)
и count(j) < count(l)
(Если count(j) == count(l)
, то оба могут быть в любом порядке - меня не беспокоит то, что сортировка стабильна, хотя это было бы бонусом).
В отсортированном результатепара [i,j]
должна появляться перед парой [k,l]
, если
min(count(i),count(j)) < min(count(k),count(l))
или
min(count(i),count(j)) == min(count(k),count(l))
и max(count(i),count(j)) < max(count(k),count(l))
.
Другими словами, если пара равна [0,1]
и 1
имеетсчитается один, но у 0
есть четыреста, пара должна все еще быть (или, по крайней мере, очень близко) впереди списка - им нужна сортировка по наименее частому элементу в паре.
Вот надуманный пример, который я построил:
input [[0,0],[1,2],[1,4],[2,2],[2,3],[3,3],[3,4]]
Вот количество отдельных элементов и исходные пары, которые они объединяют.e from:
0: 1 [0,0]
1: 2 [1,2],[1,4]
2: 3 [1,2],[2,2],[2,3]
3: 3 [2,3],[3,3],[3,4]
4: 2 [1,4],[3,4]
И вот результат вместе с оценками пары:
output: [[0,0],[1,4],[1,2],[3,4],[2,2],[2,3],[3,3]]
scores: 1 1-2 1-3 2-3 3 3 3
Здесь 0
имеет счетчик один (появляется в один пара, хотя и дважды), поэтому на первом месте.1
имеет число два, поэтому появляется второе - с [1,4]
перед [1,2]
, потому что 4
имеет число два, а 2
имеет число три и так далее.
Myтекущее решение
Как уже говорилось, я полагаю, что эта имплиментация работает точно, но просто кажется, что должен быть лучший способ сделать это.Во всяком случае, вот что я получил до сих пор:
#my implementation uncommented to reduce post size, see history for comments
def sortPairList( data , n ):
count = []
for i in range(0,n):
count.append( 0 )
#count up the data
for p in data:
count[p[0]] += 1
if p[1] != p[0]:
count[p[1]] += 1
maxcount = 0
for i in range(0,n):
if count[i] > maxcount:
maxcount = count[i]
def elementFrequency(p):
if count[ p[0] ] < count[ p[1] ]:
return count[ p[0] ] + float(count[ p[1] ]) / (maxcount+1)
else:
return count[ p[1] ] + float(count[ p[0] ]) / (maxcount+1)
data.sort( key=elementFrequency )
Есть какие-нибудь предложения по более "Python" способу сделать это?
Или что-то не так с моей текущей попыткой?
Новый тестовый пример (см. Комментарии к ответу)
input: [[0,0],[0,3],[0,5],[0,7],[1,1],[1,2],[1,8],[2,4],[2,5],[3,4],[3,5],[3,9],[4,4],[4,7],[4,8],[6,8],[7,7],[7,9],[8,9]]
expected: [[6,8],[1,1],[1,2],[2,5],[0,5],[1,8],[3,5],[3,9],[7,9],[8,9],[2,4],[0,0],[0,3],[0,7],[7,7],[3,4],[4,7],[4,8],[4,4]]