python列表添加列表_python – 将随机列表中的项添加到新列表中

你是对的,random.shuffle返回None.这是因为它将其列表参数原位混乱,并且它是一个Python约定,其函数采用可变arg并且mutate返回None.但是,你误解随机arg到random.shuffle:它需要是一个随机数生成器,而不是像你的种子一样返回相同数字的函数.

顺便说一句,您可以使用其种子函数为随机模块提供的标准随机数生成器播种. random.seed接受任何可哈希的对象作为其参数,尽管习惯上传递一个数字或字符串.您也可以将它传递给None(这在此等同于根本不传递arg),并且它将使随系统随机源播种随机数(如果没有系统随机源,则系统时间用作种子).如果在导入随机模块后没有显式调用种子,那相当于调用seed()

提供种子的好处是每次运行具有相同种子的程序时,各种随机模块函数产生的随机数将完全相同.这在开发和调试代码时非常有用:当输出不断变化时,很难跟踪错误. 🙂

有两种主要方法可以做你想要的.您可以随机播放列表,然后从中分割前5000个文件名.或者您可以使用random.sample函数获取5000个随机样本.这样你就不需要改变整个列表了.

import random

random.seed(0.47231099848)

# teens, tweens, thirties are lists of file names

file_lists = [teens, tweens, thirties]

# Shuffle

data = []

for flist in file_lists:

random.shuffle(flist)

data.append(flist[:5000])

使用样本

# Sample

data = []

for flist in file_lists:

data.append(random.sample(flist, 5000))

我没有对此代码执行速度测试,但我怀疑样本会更快,因为它只需要随机选择项目而不是移动所有列表项目. shuffle相当有效,所以你可能不会注意到运行时间的差异,除非你的青少年,补间和三十多岁的文件列表都有超过5000个文件名.

这两个循环都使数据成为包含3个子列表的嵌套列表,每个子列表中包含5000个文件名.但是,如果您希望它是15000个文件名的平面列表,则只需使用list.extend方法而不是list.append.例如,

data = []

for flist in file_lists:

data.extend(random.sample(flist, 5000))

或者我们可以使用带有双循环的列表推导来完成它:

data = [fname for flist in file_lists for fname in random.sample(flist, 5000)]

如果需要过滤数据内容以构建最终文件列表,最简单的方法是在列表推导中添加if条件.

假设我们有一个函数可以测试文件名是否是我们要保留的文件名:

def keep_file(fname):

# if we want to keep fname, return True, otherwise return False

然后我们就可以做到

data = [fname for flist in file_lists for fname in random.sample(flist, 5000) if keep_file(fname)]

和数据将只包含通过keep_file测试的文件名.

另一种方法是使用生成器表达式而不是列表推导来创建文件名,然后将其传递给内置过滤器函数:

data_gen = filter(keep_file, (fname for flist in file_lists for fname in random.sample(flist, 5000)))

data_gen本身就是一个迭代器.你可以像这样建立一个列表:

data_final = list(data_gen)

或者,如果您实际上并不需要将所有名称作为集合,并且您可以逐个处理它们,则可以将它放在for循环中,如下所示:

for fname in data_gen:

print(fname)

# Do other stuff with fname

这使用较少的RAM,但缺点是它“消耗”文件名,因此一旦for循环结束,data_gen将为空.

假设您编写了一个从每个文件中提取所需数据的函数:

def age_and_text(fname):

# Do stuff that extracts the age and desired text from the file

return fname, age, text

你可以像这样创建一个列表(文件名,年龄,文本)元组:

data_gen = (fname for flist in file_lists for fname in random.sample(flist, 5000) if keep_file(fname))

final_data = [age_and_text(fname) for fname in data_gen]

请注意我的第一个片段中的切片:flist [:5000].这需要flist中的前5000个项目,索引为0到4999的项目.你的版本有青少年[:5001],这是一个一个一个错误.切片的工作方式与范围相同.因此range(5000)产生从0到4999的5000个数字.它以这种方式工作,因为Python(像大多数现代编程语言一样)使用从零开始的索引.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值