【问题标题】:how to delete x instances of y element in a list in Python如何在Python中删除列表中y元素的x个实例
【发布时间】:2018-12-31 22:38:22
【问题描述】:

我有一个列表,在那个列表中,我有很多重复的值。这是列表的格式:

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...

在这种情况下,我有 6 个数字 1 和 7 个数字 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

【问题讨论】:

  • 将所有相关数据直接作为文本发布在这里。另外,你试过什么?您具体需要哪些帮助?
  • 此列表是否按 user_id 排序,如果不是,您是否只想删除超过 5 个的相邻重复项或超过 5 个的任何重复项?
  • 按user_id排序。我想删除超过 5 次的所有重复项

标签: python python-3.x list list-comprehension


【解决方案1】:
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)

【讨论】:

    【解决方案2】:

    您的输入似乎是listdict 实例。您可以使用各种 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 放入新列表中。

    【讨论】:

    • 这正是我想要的,谢谢!正如你所说,它确实是一个 dict 实例列表。但我并不完全理解这段代码是如何工作的。比如这行only5 = list(chain.from_iterable(islice(g, 5) for _, g in groupby(lst, key=key)))里面有这个for_,g in groupy (lst,key=key),那是怎么回事?
    • 我必须让您参考我链接的文档。您还应该在交互式解释器上玩弄所有这些函数,看看它们实际上在做什么;)但是,groupby 在对 (k, g) 上返回一个迭代器,其中 kkey 函数的结果(应用于列表元素)和g 是具有相同关键结果的元素组的迭代器。由于此行仅使用组,因此键被“丢弃”到生成器表达式中的“匿名”_ 变量。
    【解决方案3】:

    你的[1,1,1,1,1] 等列表让我很困惑,看起来你有一个字典或对象列表。

    如果您关心每个字段,您可能只需将其设为一个集合,然后返回一个列表: my_list = list(set(my_list))

    如果它们是对象,您可以覆盖 __eq__(self,other)__hash__(self),我认为您将能够使用相同的列表/集合/列表转换来删除重复项。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-21
      • 2017-08-18
      相关资源
      最近更新 更多