вывести наиболее часто встречающиеся номера списка с ранговыми связями - PullRequest
0 голосов
/ 03 апреля 2020

Я пытался найти способ распечатать k наиболее часто встречающихся текстовых файлов. Мне удалось отсортировать эти числа в список списков с его номером появления в текстовом файле.

l =[(0, 7), (3, 4), (-101, 3), (2, 3), (-3, 1), (-2, 1), (-1, 1), (101, 1)] # 0 is the number itself, 7 means it appeared in file 7 times, and etc

Итак, теперь я хочу распечатать k наиболее часто встречающихся номеров файла (должно быть сделано РЕКУРСИВНО), но я борюсь с ранговыми связями. Например, если k = 3, я хочу напечатать:

[(0, 7), (3, 4), (-101, 3), (2, 3)] # top 3 frequencies

Я попытался сделать:

def head(l): return l[0]

def tail(l): return l[1:]

def topk(l,k,e):
    if(len(l)<=1 or k==0):
        return [head(l)[1]]
    elif(head(l)[1]!=e):
        return [head(l)[1]] + topk(tail(l),k-1,head(l)[1])
    else:
        return [head(l)[1]] + topk(tail(l),k,head(l)[1])

l1 = [(0, 7), (3, 4), (-101, 3), (2, 3), (-3, 1), (-2, 1), (-1, 1), (101, 1)]
l2 = [(3.3, 4), (-3.3, 3), (-2.2, 2), (1.1, 1)]
print(topk(l1,3,''))
print(took(l2,3,''))

l1 печатает правильно, но l2 имеет дополнительную частоту по какой-то причине.

1 Ответ

2 голосов
/ 03 апреля 2020

вы можете использовать встроенную функцию sorted с параметром key, чтобы получить последнюю частоту сверху k, а затем вы можете использовать понимание списка, чтобы получить все элементы, которые имеют частоту >=, чем эта. минимальное значение:

v = sorted(l, key=lambda x: x[1])[-3][1]
[e for e in l if e[1] >= v]

вывод:

[(0, 7), (3, 4), (-101, 3), (2, 3)]

если вы хотите использовать рекурсивную версию, вы можете использовать:

def my_f(l, v, top=None, i=0):

    if top is None:
        top = []

    if l[i][1] >= v:
        top.append(l[i])

    if i == len(l) - 1:
        return top

    return my_f(l, v, top, i+1)

def topk(l, k):
    k = min(len(l), k)
    v = sorted(l, key=lambda x: x[1])[-3][1]
    return my_f(l, v)

topk(l, 3)  
...