如何判断列表(或可迭代)的数字是否都具有相同的符号?
这是我的第一个(幼稚)草案:
def all_same_sign(list):
negative_count = 0
for x in list:
if x < 0:
negative_count += 1
return negative_count == 0 or negative_count == len(list)
Run Code Online (Sandbox Code Playgroud)
有更多的pythonic和/或正确的方法吗?首先想到的是一旦你有相反的迹象就停止迭代.
更新
到目前为止,我喜欢这些答案,尽管我对表现感到疑惑 我不是一个表演迷,但我认为在处理列表时考虑性能是合理的.对于我的特定用例,我不认为这将是一个大问题,但为了完整这个问题,我认为解决它是好的.我的理解是min和max函数具有O(n)性能.到目前为止,两个建议的答案具有O(2n)性能,而一旦检测到相反的符号,我的上述例程添加短路退出将具有最差的O(n)性能.思考?
我从CSV文件中获取了一系列记录.我希望选择按日期和类型过滤这些记录,并可选择合并符合特定条件的记录.可选地,按日期和类型过滤是直截了当的Seq.filter
.但是,我想选择合并符合某些标准的记录.我有功能工作,我只是无法弄清楚如何选择将其应用于结果序列.我不能使用Seq.filter,因为合并操作对整个序列一次不在一个项目上.我可以用一个中间变量来解决它,我只是想知道是否有一种优雅的惯用方法来处理它.
基本上我想知道一种在前向管道序列中有条件地应用链的一个(或多个)部分的方法.
这是我想要的伪代码(options
保存命令行参数):
let x =
getRecords options.filePath
|> Seq.filter (fun r -> if options.Date.HasValue then
r.Date.Date = options.Date.Value.Date else true)
|> Seq.filter (fun r -> if not(String.IsNullOrEmpty(options.Type)) then
r.Type = options.Type else true)
if options.ConsolidateRecords then
|> consolidateRecords
Run Code Online (Sandbox Code Playgroud) 在web2py中如何获取当前页面的完整URL?我想要浏览器地址栏中显示的(可能已重写的)网址.
例如 http://www.example.com/products/televisions?sort=price&page=2
使用C++和boost.在Boost.Assign中,我可以将new运算符与map_list_of一起使用吗?
例如:
std::map<int, MyObject*> objects = boost::assign::map_list_of
(1, new MyObject())(2, new MyObject())(3, new MyObject())
Run Code Online (Sandbox Code Playgroud)
如果没有,还有另一种方法吗?
class ThreadWorker
{
public:
ThreadWorker(void);
virtual ~ThreadWorker(void);
static void DoSomething();
};
int main()
{
boost::thread thread1(ThreadWorker::DoSomething);
boost::thread thread2(ThreadWorker::DoSomething);
boost::thread thread3(&ThreadWorker::DoSomething);
}
Run Code Online (Sandbox Code Playgroud)
我正在玩Boost.Thread,我注意到在将静态成员函数作为参数传递时是否使用运算符(&)的地址似乎并不重要.没关系吗?如果没有,为什么?一种方式比另一种更正确吗?
c++ static-methods function-pointers member-functions address-operator
我发现这个问题什么时候使用前向声明?这是有用的,但它是描述性的而不是规定性的.
我的场景通常是我使用指向另一个类的指针作为类成员或函数参数,所以我在标题中需要的只是一个前向声明(另外,如果我切换到使用boost shared_ptr,它们将是与使用前向声明兼容?).目前我只是包括标题,但现在我想知道我是否应该使用前向声明.
所以我的问题是,如果我可以使用前瞻性声明,我应该吗?我希望这个问题不是主观的,但如果没有最佳实践答案,那么使用前瞻性声明的利弊是什么?
UPDATE
只是为了扩展shared_ptr问题(我现在没有使用它们,而是考虑切换).如果我要使用它们,我想我会在类中使用typedef的shared_ptr类型.例如:
class Customer
{
public:
typedef std::tr1::shared_ptr<Customer> SharedPointer;
Customer() {}
virtual ~Customer() {}
virtual std::string GetName() const;
};
Run Code Online (Sandbox Code Playgroud)
似乎这可能会使事情变得更加混乱.这会对前向声明产生问题,如果是这样,有一个简单的解决方法吗?
使用观察者模式。我有一个类,例如Monitor,它监视对象的集合。该类是一个Observer,其集合中的每个对象都是Subject。当前,该集合被实现为shared_ptr的std :: list。在Monitor类的Update方法中,我要检查更新是否来自其集合中的对象之一。
std::list<SomeSharedPointer> items_;
...
void Monitor::Update(Subject *subject)
{
if(subject == something_)
{
DoSomething();
}
else if
??
// if subject is one of the objects in our collection then do something..
}
Run Code Online (Sandbox Code Playgroud)
这里的主题是原始指针,我的集合是shared_ptr的列表。如何有效检查进入的主题是否是集合中的任何对象?
(请注意,如果有算法解决方案需要一个,则我的编译器msvc将支持lambda)
更新
我应该补充一点,我意识到我可以在容器上使用for循环,但是我想知道是否有一种时髦的方法。
更新2
SomeSharedPointer
为一个typedef std::shared_ptr<SomeType>
其中SomeType
从抽象类派生Subject
(标准观察者模式实现)。SomeType将在某个时候调用Notify()
,这将为Update()
每个观察者调用该方法。
当我从C#转换到C++时,我得到了很多建议,尽可能使用值语义.几乎可以肯定的是,如果我在任何地方发布带有指针的问题,并建议它应该是一个值.我开始看到了光,我在代码中找到了很多地方,我可以用堆栈分配的变量(通常是引用)替换动态分配和指针.所以我认为我掌握了使用堆栈分配的对象,并且当调用者中的对象生命周期比被调用者更长时,将它们作为引用传递给其他函数.
但是,当被调用者获得所有权时,我有一个关于按值传递对象的问题.请看以下示例:
class Zoo
{
void AddAnimal(Animal animal);
std::list<Animal> animals_;
}
Run Code Online (Sandbox Code Playgroud)
通常从灵活性和单元测试的角度来看,我希望Animal成为一个接口(C++中的抽象类),这样我就可以轻松地发送任意动物并通过模拟实现来模拟它.
在指针实现中,客户端代码将调用它:
Animal animal = new Lion("Bob");
myZoo.AddAnimal(animal);
Run Code Online (Sandbox Code Playgroud)
这里的客户端代码并不真正需要动物对象.它只是暂时构建它以传递给方法.所以在这种情况下,没有共享语义.所以它似乎是价值语义的一个好例子.但是,我的理解是你不能使用Animal作为值传递的参数,因为它是一个抽象类.
我的大多数不采用原始类型的成员函数都采用抽象类参数.那么处理这个问题的C++方法是什么?(那你是如何使用值语义编写C++接口的呢?)
c++ parameters abstract-class object-lifetime dynamic-allocation
假设我有一个 numpy 数组:
1 10
2 20
3 0
4 30
Run Code Online (Sandbox Code Playgroud)
我想添加第三列,其中每行是该行中前两列的总和(或某种任意计算):
1 10 11
2 20 22
3 0 3
4 30 34
Run Code Online (Sandbox Code Playgroud)
我怎么做?
class Whatever
{
public:
virtual ~Whatever();
protected:
Whatever();
virtual void SomeMethod();
void OnEventOccurred(int x);
std::vector<boost::signals2::scoped_connection> boostSignalConnections_;
}
Run Code Online (Sandbox Code Playgroud)
// .cpp
Whatever::SomeMethod()
{
...
boostSignalConnections_.push_back(
anObject->AddEventOccurredObserver(
std::bind(&Whatever::OnEventOccurred,
this, std::placeholders::_1)));
...
}
Run Code Online (Sandbox Code Playgroud)
(注意AddEventOccurredObserver
只委托boost::signals2::connect()
并返回boost::signals2::connection
)
我收到以下错误.很难解释模板错误,但似乎错误是在成员声明中引起的std::vector<boost::signals2::scoped_connection> boostSignalConnections_;
...\vc\include\xmemory(202): error C2248:
'boost::signals2::scoped_connection::scoped_connection' :
cannot access private member declared in class 'boost::signals2::scoped_connection'
...\boost_1_47\boost\signals2\connection.hpp(234) : see declaration of
'boost::signals2::scoped_connection::scoped_connection'
...\boost_1_47\boost\signals2\connection.hpp(210) :
see declaration of 'boost::signals2::scoped_connection'
...\vc\include\xmemory(201) : while compiling class template member function
'void std::allocator<_Ty>::construct(boost::signals2::scoped_connection *,_Ty &&)'
with
[
_Ty=boost::signals2::scoped_connection
] …
Run Code Online (Sandbox Code Playgroud) c++ ×6
boost ×2
python ×2
arrays ×1
f# ×1
include ×1
list ×1
noncopyable ×1
numpy ×1
parameters ×1
python-2.7 ×1
shared-ptr ×1
sign ×1
stdmap ×1
url ×1
web2py ×1