我完全不懂Python,但在尝试各种随机代码时,发现了一个问题,我相信我已经“解决”了这个问题,但是代码感觉不太对-我强烈怀疑有更好的方法来获得所需的结果。
FYI-我在Windows上使用最新版本的Python 3。
问题定义
简而言之,我正在对一对列表进行排序,以使包含出现次数最少的对应元素的对位于前面。
这些对的形式为[i,j]
,其中0 <= i <= j < n
,其中n
是元素的已知最大值。列表中没有重复的对。
元素i
的计数是形式为[i,j]
、[j,i]
和[i,i]
的配对(而不是成对元素)的数量,其中j
是任何导致有效对的值。
在排序结果中,如果count(i) < count(k)
或count(i) == count(k)
并且count(j) < count(l)
,则对[i,j]
应该出现在对[k,l]
之前(如果count(j) == count(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))
,则对[i,j]
应该出现在对[k,l]
之前。
换句话说,如果对为[0,1]
,而1
的计数为1,但0
的计数为400,则该对仍应位于(或至少非常接近)列表的前面-它们需要按照对中出现次数最少的元素进行排序。
这是我构建的一个假例:
input [[0,0],[1,2],[1,4],[2,2],[2,3],[3,3],[3,4]]
以下是各个元素的计数及其来源对:
这里是需要翻译的内容,涉及IT技术。
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,2]
之前出现[1,4]
,因为4
出现了两次,而2
出现了三次,以此类推。
我目前的解决方案
正如所说,我相信这个实现方法是准确的,但感觉肯定有更好的方法来做到这一点。无论如何,这就是我目前的做法:#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]]
4
和2
都有两个计数。由于3
也有两个计数,所以你的输出与输入没有任何关联。换句话说,根据你的要求,input
已经是排序好的。 - SilentGhost2
出现了三次(而不是两次),因为它出现在[1,2]
、[2,2]
和[2,3]
中。数字3
也出现了三次,分别是在[2,3]
、[3,3]
和[3,4]
中。 - DMA573610
的数量也是两个,那么为什么它应该排在1
之前呢? - SilentGhost0
只出现在一个配对中(它出现两次的事实对我来说是无关紧要的)。请注意,我还详细阐述了如何从input
得出output
的更多细节。 - DMA57361