文档章节

创建重复N次的单个项目的列表

j
 javail
发布于 01/24 18:49
字数 1071
阅读 114
收藏 0

我想创建一系列长度不一的列表。 每个列表将包含相同的元件e ,重复n次(其中n列表=长度)。

如何创建列表,而不为每个列表使用列表[e for number in xrange(n)]


#1楼

在Python中创建重复n次的单项列表

不变物品

对于不可变的项目,例如“无”,布尔值,整数,浮点数,字符串,元组或Frozensets,可以这样进行:

[e] * 4

请注意,这最好只与列表中的不可变项(字符串,元组,frozensets)一起使用,因为它们都指向内存中同一位置的同一项。 当我必须构建一个包含所有字符串的架构的表时,我会经常使用它,这样就不必提供高度冗余的一对一映射。

schema = ['string'] * len(columns)

可变项

我已经使用Python很长时间了,而且从未见过用可变实例执行上述操作的用例。 相反,要获取可变的空列表,集合或字典,您应该执行以下操作:

list_of_lists = [[] for _ in columns]

在这种情况下,下划线只是一个简单的变量名。

如果只有号码,那将是:

list_of_lists = [[] for _ in range(4)]

_并不是很特殊,但是如果您不打算使用变量并使用任何其他名称,则您的编码环境样式检查器可能会抱怨。


对可变项使用不可变方法的注意事项:

当心使用可变对象 ,当您更改其中一个对象时,它们都会更改,因为它们都是同一对象:

foo = [[]] * 4
foo[0].append('x')

foo现在返回:

[['x'], ['x'], ['x'], ['x']]

但是对于不可变的对象,您可以使其起作用,因为您可以更改引用而不是对象:

>>> l = [0] * 4
>>> l[0] += 1
>>> l
[1, 0, 0, 0]

>>> l = [frozenset()] * 4
>>> l[0] |= set('abc')
>>> l
[frozenset(['a', 'c', 'b']), frozenset([]), frozenset([]), frozenset([])]

但同样,可变对象对此没有好处,因为就地操作会更改对象,而不是引用:

l = [set()] * 4
>>> l[0] |= set('abc')    
>>> l
[set(['a', 'c', 'b']), set(['a', 'c', 'b']), set(['a', 'c', 'b']), set(['a', 'c', 'b'])]

#2楼

正如其他人指出的那样,对可变对象使用*运算符会重复引用,因此,如果更改一个,则会全部更改。 如果要创建可变对象的独立实例,则xrange语法是执行此操作的最Python方式。 如果您有一个从未使用过的命名变量而感到困扰,则可以使用匿名下划线变量。

[e for _ in xrange(n)]

#3楼

Itertools具有此功能:

import itertools
it = itertools.repeat(e,n)

当然, itertools为您提供了迭代器而不是列表。 [e] * n为您提供了一个列表,但是,根据对这些序列的处理方式, itertools变体可能会更加高效。


#4楼

您还可以编写:

[e] * n

您应该注意,例如,如果e是一个空列表,您将得到一个具有n个指向同一列表的引用的列表,而不是n个独立的空列表。

性能测试

乍看之下似乎重复是创建一个具有n个相同的元素列表的最快方法:

>>> timeit.timeit('itertools.repeat(0, 10)', 'import itertools', number = 1000000)
0.37095273281943264
>>> timeit.timeit('[0] * 10', 'import itertools', number = 1000000)
0.5577236771712819

但是等等-这不是一个公平的测试...

>>> itertools.repeat(0, 10)
repeat(0, 10)  # Not a list!!!

函数itertools.repeat实际上并不创建列表,它只是创建一个对象,您可以根据需要使用该对象创建列表! 让我们再试一次,但转换为列表:

>>> timeit.timeit('list(itertools.repeat(0, 10))', 'import itertools', number = 1000000)
1.7508119747063233

因此,如果需要列表,请使用[e] * n 。 如果要延迟生成元素,请使用repeat


#5楼

>>> [5] * 4
[5, 5, 5, 5]

当重复的项目是列表时,请当心。 该列表将不会被克隆:所有元素都将引用同一列表!

>>> x=[5]
>>> y=[x] * 4
>>> y
[[5], [5], [5], [5]]
>>> y[0][0] = 6
>>> y
[[6], [6], [6], [6]]

本文转载自:https://pt.sofbug.com/question/EVru

j
粉丝 5
博文 1144
码字总数 0
作品 0
深圳
私信 提问
使用正规表达式编写更好的SQL

Oracle Database 10g 中的正规表达式特性是一个用于处理文本数据的强大工具   Oracle Database 10g 的一个新特性大大提高了您搜索和处理字符数据的能力。这个特性就是正规表达式,是一种用...

余二五
2017/11/08
0
0
grep系的介绍及正则表达式详解

文本处理工具: 全屏编辑器:vim,nano 行编辑器: 文本处理三剑客:grep系列,sed,awk grep系列:grep,egrep,fgrep;统称为文件搜索工具;基于PATTERN(模式)对于给定的文本文件进行模糊搜...

花花很漂漂
2017/11/16
0
0
我的shell脚本编程

对于shell脚本编程特点来说它是 过程式编程语言、脚本类型语言、解释型语言。 在写脚本的时候总是会遵循三种执行结构:顺序执行结构、选择执行结构、循环执行结构。 顺序执行即:以从左到右,...

XRedm
2017/05/05
0
0
Python 字符串和正则表达式的使用

1.字符串 1.1字符串的格式化 #格式化语法"%s" % str1"%s %s" % (str1,str2) #格式化字符串 str1 = "version"num = 1.0format = "%s" % str1print (format)format = "%s %d" %(str1, num)prin......

阿豪boy
2018/02/16
38
0
随机森林

随机森林 基本原理 随机森林就是由多棵决策树组成的分类器,当对一个测试样本 X 进行预测属于哪一个类别时,每一棵决策树给出分类结果,统计结果,数量多的那一个类别就是整个森林对X的分类结...

u011582757
2017/08/31
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Rails中的ERB中的<%,<%=,<%#和-%>有什么区别?

能否请您描述一下ERB文件中使用的以下字符的用法: <% %><%= %><% -%><%# %> 每个有什么用? #1楼 Rails默认不使用stdlib的ERB ,而是使用erubis 。 资料来源: 该开发人员的评论 ...

javail
13分钟前
29
0
九型人格测试,看游戏人物性格制作

作为一个资深的宅男&游戏玩家,也算阅人无数,额,具体的说,应该是阅游戏里的人物角色无数,游戏中不管是NPC,还是玩家扮演的角色,都有这个人物自己的性格,根据剧情,我们可以判断出这个人...

蛤蟆丸子
20分钟前
45
0
聊聊skywalking的MemoryProvider

序 本文主要研究一下skywalking的MemoryProvider MemoryProvider skywalking-6.6.0/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/jvm/memory/MemoryPro......

go4it
21分钟前
21
0
ServiceLoader

1: ServiceLoader 使用简介 java 优雅地获取接口实现 2:Java ServiceLoader使用和解析 3:spring-boot-starter原理及实现方法...

whoisliang
24分钟前
39
0
SpringCloud Feign 配置token请求

相关依赖引入 <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> ......

IT-Mamba
26分钟前
41
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部