【发布时间】:2021-04-28 20:07:13
【问题描述】:
我很确定这个问题已经被问了无数次,但我找不到令人满意的答案。我试图遍历一个列表并找出'B' 有多少次出现在'A' 之前。我有一个解决方案,但我确信它远非完美。在 C++ 中,我会做类似的事情(大约有 10 种变体):
int main()
{
vector<char> charList={'A', 'B', 'D', 'B', 'C', 'A', 'B'};
int count=0;
char prevElem = '\0';
for(auto x: charList)
{
if( x == 'B' && prevElem =='A')
++count;
prevElem = x;
}
cout << "Count = " << count << endl;
return 0;
}
在 Python 中正确的做法是什么? 我的意思是最简单的解决方案是显而易见的,但是如果我拥有的数据是迭代器的形式,并且我不想重复该迭代器两次,我该怎么办?
【问题讨论】:
-
你试过用 Python 写同样的算法吗?
-
是的,这就是我所说的“远非完美”的意思。我的问题有点复杂:如果我拥有的数据是迭代器的形式,它下面有惰性迭代器并且我不想重复该迭代器两次,我该怎么办?
-
您可以在 C++ 代码中做同样的事情。
-
解决此类问题的好地方是itertools recipes,在本例中为
pairwise。 (sum(map(lambda cc:cc==('A', 'B'), pairwise(charlist))))。与使用下标或切片的解决方案不同,这将适用于任意序列,包括生成器。 -
@rici
map(lambda)很丑。生成器表达式更好更短:sum(cc==('A', 'B') for cc in pairwise(charlist))
标签: python python-3.x iterator