在python中为包含排序元组的列表提供秩号
我有一个在python中为包含排序元组的列表提供秩号,python,Python,我有一个列表,其中包含基于元组的第二个元素的排序元组 样本清单如下: [ ('not', 48), ('this', 47), ('which', 45), ('by', 45), ('as', 44), ('are', 42), ('will', 41), ('i', 40), ('but', 38), ('all', 38), ('with', 34) ] [ ('not', 48, 1), ('this', 47, 2), ('which', 45, 3),
列表
,其中包含基于元组的第二个元素
的排序元组
样本清单如下:
[ ('not', 48),
('this', 47),
('which', 45),
('by', 45),
('as', 44),
('are', 42),
('will', 41),
('i', 40),
('but', 38),
('all', 38),
('with', 34) ]
[ ('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
我需要为每个元组提供秩_编号,如下所示:
[ ('not', 48),
('this', 47),
('which', 45),
('by', 45),
('as', 44),
('are', 42),
('will', 41),
('i', 40),
('but', 38),
('all', 38),
('with', 34) ]
[ ('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
我尝试为循环编写代码,并将第二个元素彼此进行比较,但对于第二个元素相同的实例,却没有获得适当的排名
我尝试的代码如下:
[ ('not', 48),
('this', 47),
('which', 45),
('by', 45),
('as', 44),
('are', 42),
('will', 41),
('i', 40),
('but', 38),
('all', 38),
('with', 34) ]
[ ('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 = 1
for tuple in tuples:
tuple = tuple + (rank,)
rank += 1
如果我正确理解这个问题,那应该行得通。您可能需要根据自己的期望调整/比较排名 试试这个:
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 = 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
或者,如果您想更新现有列表,则可以这样做
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
我真的很喜欢麦迪用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
最近,我得到了一个“缩短”的解决方案:
将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),))]
那就行了
有趣的是,我注意到在第一个“分数”数组上需要2个数学运算:
不同的,整数的,但是,我不能把它变成一个线性的```
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开始)。是的,我知道这一点。在将秩添加到现有元组后,我创建了一个新列表,但我的问题是,无论第二个元素在哪里相同,它们的秩都应该相同。因此,当开始循环时,请尝试跟踪第二个元素。如果您当前的代码与前一个相同,请不要增加排名。向我们展示您编写的代码@Elmex80更新了帖子。请检查。我尝试了你的解决方案,它给了我相同的元素排名,其中第二个元素是相同的,但最后一个元素附加了一次。('which',45,17),('by',45,17),('by',45,18),@PrashantVikramSingh它对我有效,我刚刚更新了另一种方法,试试这个。它有效,但你能解释一下它是如何工作的吗。我指的是语法。非常感谢。这不会跳过重复的级别。3,3,5和9,9,11是OP的。排名如下1,2,3,3,5。。。因为有一个双倍上升(第三),下面的排名是第五而不是第四。如果有1,1,1,那么下面的排名将是第四而不是第二。谢谢。它按要求给出了O/P。我不确定是否可以使用您提供的第二种方法,因为列表包含元组,所以我无法更新列表。您可以更新列表本身,但不能更新元组。它所做的就是用一个新元组替换旧元组。感谢您的解决方案!