【问题标题】:How to delete random items in a list to keep the list in a certain length?如何删除列表中的随机项目以使列表保持一定长度?
【发布时间】:2023-03-11 19:13:01
【问题描述】:

我使用 pymongo 在 MongoDB 中转储集合列表。列表长度大于10000,大约12000或更长(列表长度不是一定的数字)。

但是,我只需要 10000 个列表实例。我知道列表 'l' 可以按l[:10000] 或l[len(l)-10000:] 进行切片。但我认为删除列表中项目的随机方式可能会更好。

所以我想知道如何删除列表中的随机项目以使其长度减少到 10000 长?谢谢。

【问题讨论】:

  • 请记住,随机删除元素对可测试性非常不利。您可能需要考虑删除每第 n 个元素,或者只删除前几个元素。

标签: python algorithm list random


【解决方案1】:

先打乱列表再切片:

from random import shuffle
shuffle(your_lis)
your_lis = your_lis[:10000]

如果顺序很重要:

from random import randrange
diff = len(your_lis) - 10000
for _ in xrange(diff):
    ind = randrange(len(your_lis))
    your_lis.pop(ind)  #a quick timing check suggests that `pop` is faster than `del`

【讨论】:

  • 谢谢,列表顺序无关紧要。我写了一个测试脚本,第一个使用 0.01 秒,第二个是 0.08 秒。为什么后一个慢很多?
  • @zfz 切片比 for 循环快。
  • @zfz 加上 pop 和 del 操作成本很高。
  • 谢谢!你的回答真的很有帮助。
  • @zfz 很高兴这对您有所帮助,如果它对您有用,您可以接受答案。
【解决方案2】:

如果你想保持顺序,你可以删除随机索引,例如:

def remove_random(l, count):
    for i in range(count):
        index = random.randint(0, len(l) - 1)
        del l[index]

此函数将从列表l 中删除最多count 项。

【讨论】:

    【解决方案3】:

    这是另一种方式:

    from random import random
    
    def chop(the_list, length):
        while len(the_list) > length:
            del the_list[int(random()*length)]
    
    # usage
    chop(your_list, 10000)
    

    【讨论】:

      【解决方案4】:

      使用 numpy 非常简单(为了便于阅读,只提取了 4 个项目):

      >>> import numpy as np
      >>> l = range(0, 12000)
      >>> np.random.choice(np.asarray(l), 4, false)
      

      【讨论】:

        【解决方案5】:
        def random_reduce(list, count):
            length = len(l)
            for i in range(count):
                index = random.randint(0, length - 1)
                del list[index]
                length = length - 1
        

        【讨论】:

          【解决方案6】:
          import random
          
          subsample=random.sample(population,k)
          
          

          【讨论】:

          • 值得注意的是 k 应该是 len(original_list) - number_of_items_to_delete 才能回答这个问题...
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-04-14
          • 2011-11-08
          相关资源
          最近更新 更多