Перечислите, если иначе не дает ожидаемый результат - PullRequest
0 голосов
/ 04 марта 2019

У меня есть следующий список списка:

[['3', 2], ['2370447', 282], ['5300058', 610], ['81615', 615], ['3294332', 624], ['3078798', 624], ['1804986', 643]]

Обратите внимание, что в индексах 5 и 6 второй элемент идентичен.Я пытаюсь превратить этот список, упорядоченный по второму элементу в каждом списке, в рейтинг.

Я использовал следующий if-else, чтобы исправить время, когда значения были одинаковыми:

for i in range(len(sortedCounts)):
   if i == 0:
          sortedCounts[i][1] = 0
   elif sortedCounts[i][1] == sortedCounts[i-1][1]:
          sortedCounts[i][1] = i-1
   else: 
          sortedCounts[i][1] = i

Однако, когда я печатаю список, я получаю разные рейтинги, даже если числа одинаковы:

[['3', 0], ['2370447', 1], ['5300058', 2], ['81615', 3], ['3294332', 4], ['3078798', 5], ['1804986', 6]]

Ожидаемый результат:

[['3', 0], ['2370447', 1], ['5300058', 2], ['81615', 3], ['3294332', 4], ['3078798', 4], ['1804986', 6]]

Цените любые советы, или еслиесть лучший способ, пожалуйста, сообщите.

Ответы [ 5 ]

0 голосов
/ 04 марта 2019

Насколько я понял, основная причина того, что вы не получаете одинаковый индекс для элементов на 5 и 6, заключается в том, что ваш код не входит в оператор elif, потому что при обновлении списка

with value 
    sortedCounts[i][1] = i-1

, который изменяетсясписок.

Таким образом, вместо непосредственного изменения списка вы можете создать переменную, изменить ее и добавить в новый список.

    newList = []
    for i in range(len(sortedCounts)):
        if i == 0:
            variable = 0
        elif sortedCounts[i][1] == sortedCounts[i-1][1]:
            variable = i-1
        else: 
            variable = i
        newList.append([sortedCounts[i][0], variable])
0 голосов
/ 04 марта 2019

с помощью встроенной функции сортировки может легко решить эту проблему

input_data = [['3', 2], ['2370447', 282], ['5300058', 610], ['81615', 615], ['3294332', 624], ['3078798', 624], ['1804986', 643]]

input_data.sort(key = lambda x: int(x[0]))
result = input_data.copy()
for i in range(len(result)):
    result[i][1] = i

print(result)

"""
output 
[['3', 0], ['81615', 1], ['1804986', 2], ['2370447', 3], ['3078798', 4], ['3294332', 5], ['5300058', 6]]
"""
0 голосов
/ 04 марта 2019

Я думаю, что это код, который вы ожидали

sortedCounts=[['3', 2], ['2370447', 282], ['5300058', 610], ['81615', 615], ['3294332', 624], ['3078798', 624], ['1804986', 643]]
i=0
while i<len(sortedCounts):
    if(sortedCounts[i][1]==sortedCounts[i+1][1]):
        sortedCounts[i][1]=sortedCounts[i+1][1]=i
        i=i+1
    elif(i==len(sortedCounts)):
        sortedCounts[i][1]=i
    else:
        sortedCounts[i][1]=i
    i=i+1
0 голосов
/ 04 марта 2019

Сортировка по индексу 1 с использованием sorted:

input = [['3', 2],['2370447', 282],['5300058', 610],['81615', 615],['3294332', 624],['3078798', 624],['1804986', 643]]
output = []
for i, x in enumerate(sorted(input, key=itemgetter(1))):
    x[1] = i
    output.append(x)

Короткая и сладкая.

[['3', 0], ['2370447', 1], ['5300058', 2], ['81615', 3], ['3294332', 4], ['3078798', 5], ['1804986', 6]]

0 голосов
/ 04 марта 2019
rank, last_value = -1, -1
for i, e in enumerate(sortedCount):
    if last_value < e[1]:
        rank = i
    last_value = e[1]
    sortedCount[i][1] = rank
...