相关疑难解决方法(0)

如何使用Django的ORM提取随机记录?

我有一个模特代表我在网站上出现的画作.在主要网页上,我想展示一些:最新的,大多数时间没有访问过的,最受欢迎的一个和随机的一个.

我正在使用Django 1.0.2.

虽然前三个使用django模型很容易拉,但最后一个(随机)给我带来了一些麻烦.我可以在我的视图中对它进行编码,如下所示:

number_of_records = models.Painting.objects.count()
random_index = int(random.random()*number_of_records)+1
random_paint = models.Painting.get(pk = random_index)
Run Code Online (Sandbox Code Playgroud)

在我看来,它看起来并不像我想要的东西 - 这完全是数据库抽象的一部分,应该在模型中.此外,在这里我需要处理删除的记录(然后所有记录的数量不会覆盖我所有可能的键值),可能还有很多其他的东西.

我可以做任何其他选择,最好以某种方式在模型抽象中?

python django django-models

169
推荐指数
6
解决办法
7万
查看次数

从未知长度的序列中随机选择N个项目

我正在尝试编写一种算法,该算法可以随机地从序列中选择N个不同的项目,而不需要事先知道序列的大小,并且在不止一次迭代序列的情况下进行迭代是很昂贵的.例如,序列的元素可能是一个巨大文件的行.

我在N = 1时找到了一个解决方案(也就是说,当试图从一个巨大的序列中随机选择一个元素时):

import random
items = range(1, 10) # Imagine this is a huge sequence of unknown length
count = 1
selected = None
for item in items:
    if random.random() * count < 1:
        selected = item
    count += 1
Run Code Online (Sandbox Code Playgroud)

但是如何才能为其他N值(比如N = 3)实现同样的目的呢?

python random algorithm

44
推荐指数
4
解决办法
7万
查看次数

如何在字典python中随机选择多个键及其值

我有一个这样的字典:

user_dict = {
            user1: [(video1, 10),(video2,20),(video3,1)]
            user2: [(video1, 4),(video2,8),(video6,45)]
            ...
            user100: [(video1, 46),(video2,34),(video6,4)]                 
            } 

(video1,10) means (videoid, number of request)
Run Code Online (Sandbox Code Playgroud)

现在我想随机选择10个用户并进行一些计算

 1. calculate number of videoid for each user. 
 2. sum up the number of requests for these 10 random users, etc
Run Code Online (Sandbox Code Playgroud)

然后我需要将随机数分别增加到20,30,40

但是"random.choice"一次只能选择一个值,对吧?如何选择多个键和每个键后面的列表?

python

16
推荐指数
1
解决办法
2万
查看次数

Django 查询集上的 random.sample:查询集上的采样将如何影响性能?

我试图从我的查询集中采样一些记录以提高性能,例如:

from random import sample
from my_app import MyModel


my_models = MyModel.objects.all()

# sample only a few of records for performance
my_models_sample = sample(my_models, 5)

for model in my_models_sample:
    model.some_expensive_calculation
Run Code Online (Sandbox Code Playgroud)

但我觉得它只会在执行时间方面变得更糟。

random.sample()幕后的实际工作如何?它会不会对 django 查询集造成相当大的性能负担?

python django

7
推荐指数
1
解决办法
3208
查看次数

子文件夹中的Python随机行

我在多个子文件夹中的.txt文件中有很多任务.我试图从这些文件夹,它们包含的文件以及文件中的文本行中随机选取总共10个任务.应删除或标记选定的行,以便在下次执行时不会选择它.这可能是一个太宽泛的问题,但我很欣赏任何意见或方向.

这是我到目前为止的代码:

#!/usr/bin/python  
import random   
with open('C:\\Tasks\\file.txt') as f:  
    lines = random.sample(f.readlines(),10)    
print(lines)
Run Code Online (Sandbox Code Playgroud)

python random-sample python-3.x

6
推荐指数
2
解决办法
1814
查看次数

从大型组合生成器中随机采样

在高层次上,我试图从列表中的 n 个项目的所有组合中对 n_samples 个项目进行采样。在 n 值较小且列表长度相对较小时(n <= 5,len(list) < 75),这很好 - 我只是使用 itertools 生成组合,转换为列表,然后使用 random.sample 随机采样正确的数字.

但是,我的用例要求我生成组合,随机采样几千个元素,然后从列表中删除其中一个组合,然后从较小的列表重新开始。

这会在 n 和 len(list) 的高值时产生问题 - 有 120 个列表项且 n = 5,这个用例意味着我必须多次进行列表转换,因此我受到生成器的时间限制 --> 列表转换对于具有约 1.9 亿个项目的生成器。这需要非常长的时间(对于特别糟糕的示例,超过 20 分钟)。

用例不需要统计统一的样本或任何东西,我纯粹使用抽样,因为高 n 和长列表处理每个可能的组合在计算上是不切实际的,并且快速处理非常重要。

我切换到使用 iterator.islice 方法只从生成器中获取第一个 n_samples 项并使用它们。这显着提高了速度(之前需要 20 分钟的示例现在需要 34 秒),但性能受到了打击。我认为这是由于 itertools 如何生成组合 - 例如,

list(itertools.combinations(list(range(4)), 2))
Run Code Online (Sandbox Code Playgroud)

产生这个列表: [(0, 1), (0, 2), (0, 3), (1, 2), (1, 3), (2, 3)]

所以看起来如果我有一个足够长的列表和一个足够大的 n,仅仅通过将它们从生成器中拉出来采样甚至 100,000+ 个项目将导致 100,000+ 个项目,其中第一个元素是相同的,这是不理想的。正如我所说,我不需要完美的随机抽样,但我认为使用这种方法而不是在整个列表中随机抽样导致我的性能崩溃是由于这个原因。

基本上,我需要一种好方法来有效地从长度为 n 的所有可能组合(其中 n 通常在 2-8 左右的范围内)中对 …

python random combinations python-itertools

5
推荐指数
1
解决办法
709
查看次数

来自python中非常长的迭代的随机样本

我有一个很长的python生成器,我想通过随机选择一个值的子集来"稀释".不幸的是,random.sample()不能使用任意迭代.显然,它需要支持len()操作的东西(可能是对序列的非顺序访问,但这一点并不清楚).而且我不想建立一个庞大的列表,所以我可以把它简化.

事实上,有可能在一次通过中均匀地从序列中采样,而不知道它的长度 - 这就是一个很好的算法Programming perl(编辑:"水库采样",谢谢@ user2357112!).但有没有人知道提供此功能的标准python模块?

演示问题(Python 3)

>>> import itertools, random
>>> random.sample(iter("abcd"), 2)
...
TypeError: Population must be a sequence or set.  For dicts, use list(d).
Run Code Online (Sandbox Code Playgroud)

在Python 2上,错误更透明:

Traceback (most recent call last):
  File "<pyshell#12>", line 1, in <module>
    random.sample(iter("abcd"), 2)
  File "/usr/local/Cellar/python/2.7.9/Frameworks/Python.framework/Versions/2.7/lib/python2.7/random.py", line 321, in sample
    n = len(population)
TypeError: object of type 'iterator' has no len()
Run Code Online (Sandbox Code Playgroud)

如果没有别的选择random.sample(),我会试着把发电机包装成一个提供__len__方法的对象(我可以事先找出它的长度).所以我会接受一个答案,说明如何干净利落地做到这一点.

python random python-3.x

4
推荐指数
1
解决办法
1831
查看次数

使用python选择随机行并写入新文件

我需要打开一个csv文件,选择1000个随机行并将这些行保存到一个新文件中.我被困住了,看不出怎么做.有人可以帮忙吗?

python random-sample

0
推荐指数
1
解决办法
9184
查看次数