这是我目前的代码:
print(list[0], list[1], list[2], list[3], list[4], sep = '\t')
Run Code Online (Sandbox Code Playgroud)
我想写得更好.但
print('\t'.join(list))
Run Code Online (Sandbox Code Playgroud)
不会起作用,因为列表元素可能是数字,其他列表等,所以join会抱怨.
更新基于Lennart Regebro的回答
假设您遍历字典,有时需要删除元素.以下是非常有效的:
remove = []
for k, v in dict_.items():
if condition(k, v):
remove.append(k)
continue
# do other things you need to do in this loop
for k in remove:
del dict_[k]
Run Code Online (Sandbox Code Playgroud)
这里唯一的开销是构建要删除的键列表; 除非它与字典大小相比变大,否则不是问题.但是,这种方法需要一些额外的编码,所以它不是很受欢迎.
流行的词典理解方法:
dict_ = {k : v for k, v in dict_ if not condition(k, v)}
for k, v in dict_.items():
# do other things you need to do in this loop
Run Code Online (Sandbox Code Playgroud)
导致完整的字典副本,如果字典变大或经常调用包含函数,则存在愚蠢的性能损失的风险.
更好的方法是仅复制密钥而不是整个字典:
for k in list(dict_.keys()):
if condition(k, dict_[k]):
del dict_[k]
continue
# do …Run Code Online (Sandbox Code Playgroud) 注意:我不是在谈论阻止重新绑定变量.我在谈论防止变量引用的内存的修改,以及通过嵌套容器跟随的任何内存.
我有一个大型数据结构,我想以只读方式将其公开给其他模块.在Python中执行此操作的唯一方法是深层复制我想要公开的特定部分 - 在我的情况下非常昂贵.
我确信这是一个非常普遍的问题,似乎一个恒定的参考将是一个完美的解决方案.但我必须遗漏一些东西.也许在Python中很难实现常量引用.也许他们并不像我认为的那样做.
任何见解将不胜感激.
虽然答案很有帮助,但我还没有看到为什么const难以实现或在Python中难以实现的原因.我猜"非Pythonic"也算是一个有效的理由,但它真的吗?Python确实对私有实例变量进行了加扰(从一开始__)以避免意外错误,并且const在精神上似乎没有那么不同.
编辑:我刚刚提供了一个非常适度的赏金.我正在寻找更多关于为什么Python没有const结束的细节.我怀疑原因是实施起来真的很难; 我想明白为什么这么难.
python language-features language-design reference constants
我正在浏览一些代码,我发现了一些三元运算符.这段代码是我们使用的库,它应该非常快.
我在想,除了那里的空间,我们还要保存任何东西.
你有什么经历?
我defaultdict(set)用来填充非常大的数据结构中的内部映射.填充后,整个结构(包括映射)将暴露给客户端代码.那时,我不希望任何人修改映射.
并且没有人故意这样做.但有时,客户端代码可能会意外地引用不存在的元素.此时,普通字典会引发KeyError,但由于映射是defaultdict,它只是在该键上创建一个新元素(空集).这很难理解,因为一切都是默默无闻的.但我需要确保不会发生这种情况(语义实际上不会中断,但映射会变得很大).
我该怎么办?我可以看到这些选择:
查找当前和未来客户端代码中的所有实例,其中对映射执行字典查找,并将其转换为其他实例mapping.get(k, {}).这太可怕了.
defaultdict数据结构完全初始化后,通过将其转换为"冻结" dict.(我知道它并没有真正冻结,但我相信客户端代码实际上并没有写mapping[k] = v.)不雅,并且性能大.
包装defaultdict成一个dict界面.这样做的优雅方式是什么?我担心性能损失可能很大(这种查找在紧密循环中被大量使用).
子类defaultdict并添加一个"关闭"所有defaultdict功能的方法,使其表现得像是常规的dict.这是上面3的变种,但我不确定它是否更快.如果不依赖于实施细节,我不知道它是否可行.
dict在数据结构中使用regular ,重写那里的所有代码,首先检查元素是否在字典中,如果不在,则添加它.不好.
如何创建一个使芹菜任务看起来像的包装器asyncio.Task?或者有更好的方法将Celery与asyncio?
Celery的创建者@asksol 说:
在异步I/O框架之上使用Celery作为分布式层是很常见的(最重要的提示:将CPU绑定任务路由到prefork worker意味着它们不会阻止您的事件循环).
但我找不到专门针对asyncio框架的代码示例.
据我了解,__init__()和__enter__()上下文管理的方法调用一次每个,一个接一个,不留下任何机会之间执行任何其他代码.将它们分成两种方法的目的是什么,我应该将它们放入每种方法中?
编辑:对不起,没注意文档.
编辑2:实际上,我感到困惑的原因是因为我在想@contextmanager装饰师.使用创建的上下文管理器@contextmananger只能使用一次(第一次使用后生成器将耗尽),因此通常使用构造函数内部with语句编写; 如果这是使用with陈述的唯一方法,我的问题就有意义了.当然,实际上,情境管理者比@contextmanager可以创造的更为笼统; 特别是上下文管理器通常可以重用.我希望这次能做对吗?
CPython的deque被实现为64项的双向链表大小的"块"(阵列).除了链表两端的那些块外,这些块都是满的.在IIUC中,当pop/ popleft删除块中的最后一项时,块被释放; 当append/ appendleft尝试添加新项目并且相关块已满时,将分配它们.
我理解使用链接列表而不是链接项列表所列出的优点:
malloc/ free添加/删除的每个项目执行/的运行时成本但是为什么不是首先使用单个动态大小的圆形数组而不是双链表呢?
AFAICT,圆形阵列将保留所有上述优点,并维持(atortized)成本pop*/ append*at O(1)(通过分配,就像在中list).此外,它还可以提高从当前O(n)到索引的索引查找成本O(1).循环数组也可以更简单地实现,因为它可以重用大部分list实现.
我可以在C++这样的语言中看到支持链表的论证,其中可以O(1)使用指针或迭代器从中间删除项目; 但是,python deque没有API来执行此操作.
我正在使用Python 3.5和Mypy对我的脚本进行一些基本的静态检查.最近我重构了一些返回OrderedDict的方法,但是当我尝试使用指定了Key和Value类型的返回注释时,遇到了''type'对象不可订阅"错误.
减少的例子:
#!/usr/bin/env python3.5
from collections import OrderedDict
# this works
def foo() -> OrderedDict:
result = OrderedDict() # type: OrderedDict[str, int]
result['foo'] = 123
return result
# this doesn't
def foo2() -> OrderedDict[str, int]:
result = OrderedDict() # type: OrderedDict[str, int]
result['foo'] = 123
return result
print(foo())
Run Code Online (Sandbox Code Playgroud)
这是运行时的python输出:
Traceback (most recent call last):
File "./foo.py", line 12, in <module>
def foo2() -> OrderedDict[str, int]:
TypeError: 'type' object is not subscriptable
Run Code Online (Sandbox Code Playgroud)
然而,Mypy对注释中的类型注释没有任何问题,实际上如果我尝试这样做就会发出警告result[123] = 123.
是什么造成的?
我想使用一个OrderedDict,其中键是一个枚举,并且该项是某个类.
我如何使用输入模块来暗示这一点?什么是这个暗示的namedtuple ::
Move = typing.NamedTuple('Move', [('actor', Actor), ('location', Location)])
Run Code Online (Sandbox Code Playgroud) python ×9
python-3.x ×6
python-3.5 ×2
asynchronous ×1
c++ ×1
celery ×1
constants ×1
cpython ×1
defaultdict ×1
dictionary ×1
if-statement ×1
iterator ×1
mypy ×1
printing ×1
reference ×1
typing ×1
wrapper ×1