как удалить x экземпляров элемента y в списке в Python - PullRequest
0 голосов
/ 01 января 2019

У меня есть список, и в этом списке много дублированных значений.Это формат списка:

https://imgur.com/a/tj2ZwxG

Итак, у меня есть несколько полей в следующем порядке: "User_ID" "Movie_ID" "Rating" "Time"

То, что я хочу сделать, это удалить из 5-го вхождения «User_ID», пока я не найду другой «User_ID».Например:

Давайте предположим, что у меня есть список только с «User_ID» (от 1 до 196), например:

1, 1, 1, 1, 1, 1, 2,2, 2, 2, 2, 2, 2 ...

В этом случае у меня есть шесть вхождений с номером 1 и семь вхождений с номером 2.

Итак, я удалю,с 1, после пятого вхождения, пока не найду первое «2».И то же самое для 2: я начну удалять после его пятого вхождения, пока не найду новый номер, который будет «3» и т. Д.

Итак, я получу новый список, какэто: 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, содержащее только 5 экземпляров каждого отдельного элемента.

Я знаю, что могу получить доступ ко всем полям "User_ID" следующим образом:list[index]["User_ID"]

есть ли функция, которая это делает?Или, если нет, может кто-нибудь помочь мне создать его?

Спасибо за помощь!

Я пытался сделать что-то вроде этого:

a = 0
b = 1
start = 0
position = 0

while(something that I don't know):
    while(list[a]['User_ID'] == list[b]['User_ID']): #iterate through the list, and I only advance to the next elements if the previous and next elements are the same
        a+=1
        b+=1
        position+=1 
    if(list[a]['User_ID'] != list[b]['User_ID']): #when I finally find a different element
        del new_list[start:start+position] #I delete from the start position, which is five untill the position before the different element.
        a+=1
        b+=1
        start+=5

Ответы [ 3 ]

0 голосов
/ 01 января 2019

Ваш ввод выглядит как list из dict экземпляров.Вы можете использовать различные itertools, чтобы сохранить только 5 диктов с одинаковой клавишей User_ID в эффективном пространстве и времени:

from itertools import chain, groupby, islice
from operator import itemgetter

lst = [{'User_ID': 1, ...}, {'User_ID': 1, ...}, ..., {'User_ID': 2, ...}, ...]    

key = itemgetter('User_ID')
only5 = list(chain.from_iterable(islice(g, 5) for _, g in groupby(lst, key=key)))

Это группирует список на куски с одинаковымиUser_ID и затем берет первый 5 из каждого куска в новый список.

0 голосов
/ 01 января 2019
list=[1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,3,3,3,3,3,3,3,3]
unique=set(list)

for x in unique:
   y=list.count(x)
   while y>5:
       list.remove(x)
       y-=1

print(list)
0 голосов
/ 01 января 2019

Меня больше всего смущает ваш список [1,1,1,1,1] и т. Д., Похоже, у вас есть список диктов или объектов.

Если вам небезразлично каждое поле, вы, возможно, просто сделаете его набором, а затем вернетесь назад.в список: my_list = list(set(my_list))

если они являются объектами, вы можете переопределить __eq__(self,other) и __hash__(self), и я думаю, что вы сможете использовать одно и то же преобразование списка / набора / списка для удаления дубликатов.

...