小编max*_*max的帖子

打印列表的制表符分隔值

这是我目前的代码:

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会抱怨.

python printing python-3.x

28
推荐指数
3
解决办法
6万
查看次数

自定义dict,允许在迭代期间删除

更新基于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 dictionary iterator python-3.x

26
推荐指数
2
解决办法
4634
查看次数

为什么Python决定反对常量引用?

注意:我不是在谈论阻止重新绑定变量.我在谈论防止变量引用的内存的修改,以及通过嵌套容器跟随的任何内存.

我有一个大型数据结构,我想以只读方式将其公开给其他模块.在Python中执行此操作的唯一方法是深层复制我想要公开的特定部分 - 在我的情况下非常昂贵.

我确信这是一个非常普遍的问题,似乎一个恒定的参考将是一个完美的解决方案.但我必须遗漏一些东西.也许在Python中很难实现常量引用.也许他们并不像我认为的那样做.

任何见解将不胜感激.


虽然答案很有帮助,但我还没有看到为什么const难以实现或在Python中难以实现的原因.我猜"非Pythonic"也算是一个有效的理由,但它真的吗?Python确实对私有实例变量进行了加扰(从一开始__)以避免意外错误,并且const在精神上似乎没有那么不同.


编辑:我刚刚提供了一个非常适度的赏金.我正在寻找更多关于为什么Python没有const结束的细节.我怀疑原因是实施起来真的很难; 我想明白为什么这么难.

python language-features language-design reference constants

25
推荐指数
3
解决办法
3031
查看次数

三元运算符与if语句的漂亮

我正在浏览一些代码,我发现了一些三元运算符.这段代码是我们使用的库,它应该非常快.

我在想,除了那里的空间,我们还要保存任何东西.

你有什么经历?

c++ if-statement ternary-operator

25
推荐指数
4
解决办法
3万
查看次数

将`defaultdict`暴露为常规`dict`

defaultdict(set)用来填充非常大的数据结构中的内部映射.填充后,整个结构(包括映射)将暴露给客户端代码.那时,我不希望任何人修改映射.

并且没有人故意这样做.但有时,客户端代码可能会意外地引用不存在的元素.此时,普通字典会引发KeyError,但由于映射是defaultdict,它只是在该键上创建一个新元素(空集).这很难理解,因为一切都是默默无闻的.但我需要确保不会发生这种情况(语义实际上不会中断,但映射会变得很大).

我该怎么办?我可以看到这些选择:

  1. 查找当前和未来客户端代码中的所有实例,其中对映射执行字典查找,并将其转换为其他实例mapping.get(k, {}).这太可怕了.

  2. defaultdict数据结构完全初始化后,通过将其转换为"冻结" dict.(我知道它并没有真正冻结,但我相信客户端代码实际上并没有写mapping[k] = v.)不雅,并且性能大.

  3. 包装defaultdict成一个dict界面.这样做的优雅方式是什么?我担心性能损失可能很大(这种查找在紧密循环中被大量使用).

  4. 子类defaultdict并添加一个"关闭"所有defaultdict功能的方法,使其表现得像是常规的dict.这是上面3的变种,但我不确定它是否更快.如果不依赖于实施细节,我不知道它是否可行.

  5. dict在数据结构中使用regular ,重写那里的所有代码,首先检查元素是否在字典中,如果不在,则添加它.不好.

python wrapper python-3.x defaultdict

25
推荐指数
1
解决办法
4076
查看次数

如何将芹菜与asyncio结合起来?

如何创建一个使芹菜任务看起来像的包装器asyncio.Task?或者有更好的方法将Celery与asyncio

Celery的创建者@asksol :

在异步I/O框架之上使用Celery作为分布式层是很常见的(最重要的提示:将CPU绑定任务路由到prefork worker意味着它们不会阻止您的事件循环).

但我找不到专门针对asyncio框架的代码示例.

python asynchronous celery python-3.x python-asyncio

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

在上下文管理器中__init__ vs __enter__

据我了解,__init__()__enter__()上下文管理的方法调用一次每个,一个接一个,不留下任何机会之间执行任何其他代码.将它们分成两种方法的目的是什么,我应该将它们放入每种方法中?

编辑:对不起,没注意文档.

编辑2:实际上,我感到困惑的原因是因为我在想@contextmanager装饰师.使用创建的上下文管理器@contextmananger只能使用一次(第一次使用后生成器将耗尽),因此通常使用构造函数内部with语句编写; 如果这是使用with陈述的唯一方法,我的问题就有意义了.当然,实际上,情境管理者比@contextmanager可以创造的更为笼统; 特别是上下文管理器通常可以重用.我希望这次能做对吗?

python contextmanager python-3.x

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

为什么deque实现为链表而不是循环数组?

CPython的deque实现为64项的双向链表大小的"块"(阵列).除了链表两端的那些块外,这些块都是满的.在IIUC中,当pop/ popleft删除块中的最后一项时,块被释放; 当append/ appendleft尝试添加新项目并且相关块已满时,将分配它们.

我理解使用链接列表而不是链接项列表所列出的优点:

  • 减少每个项目中prev和next的指针的内存成本
  • 减少为malloc/ free添加/删除的每个项目执行/的运行时成本
  • 通过将连续指针放在彼此旁边来改善缓存局部性

但是为什么不是首先使用单个动态大小的圆形数组而不是双链表呢?

AFAICT,圆形阵列将保留所有上述优点,并维持(atortized)成本pop*/ append*at O(1)(通过分配,就像在中list).此外,它还可以提高从当前O(n)到索引的索引查找成本O(1).循环数组也可以更简单地实现,因为它可以重用大部分list实现.

我可以在C++这样的语言中看到支持链表的论证,其中可以O(1)使用指针或迭代器从中间删除项目; 但是,python deque没有API来执行此操作.

python cpython python-3.x python-internals

23
推荐指数
2
解决办法
1159
查看次数

如何为Mypy类型注释指定OrderedDict K,V类型?

我正在使用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.

是什么造成的?

python python-3.5 mypy

20
推荐指数
3
解决办法
4558
查看次数

如何通过python 3.5输入模块键入提示collections.OrderedDict

我想使用一个OrderedDict,其中键是一个枚举,并且该项是某个类.

我如何使用输入模块来暗示这一点?什么是这个暗示的namedtuple ::

Move = typing.NamedTuple('Move', [('actor', Actor), ('location', Location)])
Run Code Online (Sandbox Code Playgroud)

python typing python-3.5

19
推荐指数
2
解决办法
1693
查看次数