- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在使用一个 Python 对象,它实现了 __add__
,但没有子类化 int
。 MyObj1 + MyObj2
工作正常,但是 sum([MyObj1, MyObj2])
导致了 TypeError
,因为 sum()
首先尝试 0 + MyObj
。为了使用sum()
,我的对象需要__radd__
来处理MyObj + 0
或者我需要提供一个空对象作为 start
参数。所讨论的对象并非设计为空。
在任何人问之前,该对象既不是列表也不是字符串,因此使用 join() 或 itertools 无济于事。
编辑细节:该模块有一个 SimpleLocation 和一个 CompoundLocation。我将 Location 缩写为 Loc。 SimpleLoc
包含一个右开区间,即 [start, end)。添加 SimpleLoc
会产生一个 CompoundLoc
,其中包含一个区间列表,例如[[3, 6), [10, 13)]
。最终用途包括遍历联合,例如[3, 4, 5, 10, 11, 12]
,检查长度和成员资格。
数字可以相对较大(例如,小于 2^32,但通常为 2^20)。间隔可能不会很长(100-2000,但可能更长)。当前,仅存储端点。我现在正在尝试对 set
进行子类化,以便将位置构造为 set(xrange(start, end))
。但是,添加集合会让 Python(和数学家)适应。
我看过的问题:
我正在考虑两种解决方案。一种是避免使用 sum()
并使用此 comment 中提供的循环.我不明白为什么 sum()
首先将 iterable 的第 0 项添加到 0 而不是添加第 0 项和第 1 项(就像链接注释中的循环);我希望有一个神秘的整数优化原因。
我的另一个解决方案如下;虽然我不喜欢硬编码的零检查,但这是我能够使 sum()
工作的唯一方法。
# ...
def __radd__(self, other):
# This allows sum() to work (the default start value is zero)
if other == 0:
return self
return self.__add__(other)
总而言之,是否有另一种方法可以对既不能与整数相加也不能为空的对象使用sum()
?
最佳答案
代替 sum
,使用:
import operator
from functools import reduce
reduce(operator.add, seq)
在 Python 2 中,reduce
是内置的,因此看起来像这样:
import operator
reduce(operator.add, seq)
Reduce 通常比 sum 更灵活 - 您可以提供任何二进制函数,而不仅仅是 add
,并且您可以可选地提供一个初始元素,同时 sum
总是使用一个。
另请注意:(警告:前面有数学问题)
从代数的角度来看,为没有中性元素的对象提供对 add
的支持有点尴尬。
请注意所有:
与加法一起形成一个Monoid - 即它们具有关联性并具有某种中性元素。
如果您的操作不是关联的并且没有中性元素,那么它就不会“类似于”加法。因此,不要指望它能与 一起很好地工作求和
。
在这种情况下,使用函数或方法而不是运算符可能会更好。这可能不那么令人困惑,因为您的类的用户看到它支持 +
,可能会期望它以幺半群的方式运行(就像加法通常那样)。
感谢您的扩展,我现在将引用您的特定模块:
这里有2个概念:
添加简单位置确实有意义,但它们不会形成幺半群,因为它们的添加不满足闭包的基本属性 - 两个 SimpleLoc 的总和不是 SimpleLoc。通常,它是一个 CompoundLoc。
OTOH,在我看来,带有加法的 CompoundLocs 就像一个幺半群(一个可交换的幺半群,而我们正在讨论它):它们的总和也是一个 CompoundLoc,它们的加法是结合的、交换的和中性元素是包含零个 SimpleLoc 的空 CompoundLoc。
如果你同意我的观点(并且以上符合你的实现),那么你将能够使用 sum
如下:
sum( [SimpleLoc1, SimpleLoc2, SimpleLoc3], start=ComplexLoc() )
的确,这个appears to work .
I am now tentatively thinking of attempting to subclass set such that the location is constructed as set(xrange(start, end)). However, adding sets will give Python (and mathematicians) fits.
好吧,位置是一些数字集,所以在它们之上抛出一个类似集合的接口(interface)是有意义的(所以 __contains__
, __iter__
, __len__
,也许 __or__
作为 +
的别名,__and__
作为产品等)。
至于从xrange
构造,你真的需要吗?如果您知道您正在存储间隔集,那么您可能会通过坚持 [start, end)
对的表示来节省空间。您可以引入一个实用方法,该方法采用任意整数序列并将其转换为最佳 SimpleLoc
或 CompoundLoc
(如果您觉得它会有所帮助)。
关于python - 避免 Python sum 默认启动 arg 行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11624955/
我们已经有一个使用 AnyEvent 的库。它在内部使用 AnyEvent,并最终返回一个值(同步 - 不使用回调)。有什么方法可以将这个库与 Mojolicious 一起使用吗? 它的作用如下: #
我想从 XSD 文件生成带有 JAXB 的 Java 类。 问题是,我总是得到一些像这样的类(删除了命名空间): public static class Action { @X
我有一个关于 html 输入标签或 primefaces p:input 的问题。为什么光标总是自动跳转到输入字段。我的页面高度很高,因此您需要向下滚动。输入字段位于页面末尾,光标自动跳转(加载)到页
我今天在考虑面向对象设计,我想知道是否应该避免 if 语句。我的想法是,在任何需要 if 语句的情况下,您都可以简单地创建两个实现相同方法的对象。这两个方法实现只是原始 if 语句的两个可能的分支。
String graphNameUsed = graphName.getName(); if (graphType.equals("All") || graphType.equals(
我有一张友谊 table CREATE TABLE IF NOT EXISTS `friendList` ( `id` int(10) NOT NULL, `id_friend` int(10
上下文 Debian 64。Core 2 二人组。 摆弄循环。我使用了同一循环的不同变体,但我希望尽可能避免条件分支。 但是,即使我认为它也很难被击败。 我考虑过 SSE 或位移位,但它仍然需要跳转(
我最近在 Java 中创建了一个方法来获取字符串的排列,但是当字符串太长时它会抛出这个错误:java.lang.OutOfMemoryError: Java heap space我确信该方法是有效的,
我正在使用 (C++) 库,其中需要使用流初始化对象。库提供的示例代码使用此代码: // Declare the input stream HfstInputStream *in = NULL; tr
我有一个 SQL 查询,我在 WHERE 子句中使用子查询。然后我需要再次使用相同的子查询将其与不同的列进行比较。 我假设没有办法在子查询之外访问“emp_education_list li”? 我猜
我了解到在 GUI 线程上不允许进行网络操作。对我来说还可以。但是为什么在 Dialog 按钮点击回调上使用这段代码仍然会产生 NetworkOnMainThreadException ? new T
有没有办法避免在函数重定向中使用 if 和硬编码字符串,想法是接收一个字符串并调用适当的函数,可能使用模板/元编程.. #include #include void account() {
我正在尝试避免客户端出现 TIME_WAIT。我连接然后设置 O_NONBLOCK 和 SO_REUSEADDR。我调用 read 直到它返回 0。当 read 返回 0 时,errno 也为 0。我
我正在开发 C++ Qt 应用程序。为了在应用程序或其连接的设备出现故障时帮助用户,程序导出所有内部设置并将它们存储在一个普通文件(目前为 csv)中。然后将此文件发送到公司(例如通过邮件)。 为避免
我有一组具有公共(public)父类(super class)的 POJO。这些存储在 superclass 类型的二维数组中。现在,我想从数组中获取一个对象并使用子类 的方法。这意味着我必须将它们转
在我的代码中,当 List 为 null 时,我通常使用这种方法来避免 for 语句中的 NullPointerException: if (myList != null && myList.size
我正在尝试避免客户端出现 TIME_WAIT。我连接然后设置 O_NONBLOCK 和 SO_REUSEADDR。我调用 read 直到它返回 0。当 read 返回 0 时,errno 也为 0。我
在不支持异常的语言和/或库中,许多/几乎所有函数都会返回一个值,指示其操作成功或失败 - 最著名的例子可能是 UN*X 系统调用,例如 open( ) 或 chdir(),或一些 libc 函数。 无
我尝试按值提取行。 col1 df$col1[col1 == "A"] [1] "A" NA 当然我只想要“A”。如何避免 R 选择 NA 值?顺便说一句,我认为这种行为非常危险,因为很多人都会陷入
我想将两个向量合并到一个数据集中,并将其与函数 mutate 集成为 5 个新列到现有数据集中。这是我的示例代码: vector1% rowwise()%>% mutate(vector2|>
我是一名优秀的程序员,十分优秀!