在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。我不确定是否可以使用您提供的第二种方法,因为列表包含元组,所以我无法更新列表。您可以更新列表本身,但不能更新元组。它所做的就是用一个新元组替换旧元组。感谢您的解决方案!