为包含 python 中排序元组的列表提供排名号



我有一个list,其中包含元组2nd elementsorted tuplesbased

示例列表如下:

[ ('not', 48),
('this', 47),
('which', 45),
('by', 45),
('as', 44),
('are', 42),
('will', 41),
('i', 40),
('but', 38),
('all', 38),
('with', 34) ]

我需要为每个元组提供rank_number,如下所示:

[ ('not', 48, 1),
('this', 47, 2),
('which', 45, 3),
('by', 45, 3),
('as', 44, 5),
('are', 42, 6),
('will', 41, 7),
('i', 40, 8),
('but', 38, 9),
('all', 38, 9),
('with', 34, 11) ]

我尝试为循环编写并相互比较第二个元素,但在第二个元素相同的实例中没有得到适当的排名。

我尝试的代码如下:

sorted_rank_words = []
rank_number = 1
list1 = sorted_words
count1 = 0
count2 = 0
for x in sorted_words:
r1 = list1.index(x)
list1.pop(r1)
for y in list1:
if x[1] > y[1]:
count1 = count1 + 1
elif x[1] == y[1]: 
count2 = count2 + 1
if count1 > 0:
sorted_rank_words.append(x+(rank_number,))
rank_number = rank_number + 1
elif count2 > 0:
sorted_rank_words.append(x+(rank_number,))
rank_number = rank_number + count2
count1 = 0
count2 = 0

如果你想要一个更新项目的新列表,那么你可以这样做。

rank = 0
skip = 0
prev = None
res = []
for word, v in lst:
if v == prev:
skip += 1
else:
rank += skip + 1
skip = 0
res.append( (word, v, rank) )    
prev = v

或者,如果您想更新现有列表,则可以这样做。

rank = 0
skip = 0
prev = None
for i, (word, v) in enumerate(lst):
if v == prev:
skip += 1
else:
rank += skip + 1
skip = 0
lst[i] += (rank,)  
prev = v

我真的很喜欢McGrady使用itertools.groupby的原始答案,并希望让它工作,因为它更干净一些,所以我也在这里添加了我的更新版本。

from itertools import groupby
result = []
skip = 0
for rank, (_, g) in enumerate(groupby(lst, key=lambda xs: xs[1]), 1):
count = -1
for v in g:
count += 1
result.append(v + (rank + skip,))
skip += count

试试这个:

result=[]

tmp=0
rank=0
count=1
for i in tuples:
if i[1]==tmp:
result.append(i+(rank,))
else:
result.append(i + (count,))
tmp=i[1]
rank=count
count+=1
print result

你会得到

[('not', 48, 1), ('this', 47, 2), ('which', 45, 3), ('by', 45, 3), ('as', 44, 5), ('are', 42, 6), ('will', 41, 7), ('i', 40, 8), ('but', 38, 9), ('all', 38, 9), ('with', 34, 11)]

希望这有帮助。

元组是不可变的,因此最好的方法是遍历元组,并为每个元组创建一个新元组,并将秩添加到其末尾。

rank = 1
for tuple in tuples:
tuple = tuple + (rank,)
rank += 1

如果我正确理解问题,这应该有效。您可能需要根据自己的需要调整/比较排名。

'''

results = []
prevcount, prevrank = 0, 1
for idx, t in enumerate(inputs):
# when the current count is similar to the previous one
if t[1] == prevcount:
# add rank to the tuple and append to the results list
results.append(t + (prevrank,)) 
else: 
results.append(t + (idx + 1,))
# update rank and count
prevrank = idx + 1
prevcount = t[1]

'''

注意:循环访问输入列表。 当当前计数与前一个计数相似时,我们可以使排名与前一个相同,并将其连接到元组;然后,追加到结果列表。 否则,排名是元组在输入列表中的位置(从索引 1 开始)。

最近,我得到了这个"缩短"的解决方案:

base定义为元组数组之后

b = [('',10e10)]+base[:]
r,s =[],[]
for x in range(len(b)-1):
r+=[bool(b[x][1] - b[x+1][1])]
s+=[(b[x+1] + (sum(r),))]

那会做到的,

有趣的是,我注意到在第一个"score"数组上需要 2 次数学运算: 差分和整数,但是,我无法将其放入一个线性

最新更新