识别列表中连续重复项的最 Pythonic 方法是什么?
我有一个整数列表,我希望能够识别连续的重复块:也就是说,我想生成一个保序的双组列表,其中每个双组包含(int_in_question,出现次数)。
例如,如果我有一个如下列表:
[0, 0, 0, 3, 3, 2, 5, 2, 6, 6]
我希望结果是:
[(0, 3), (3, 2), (2, 1), (5, 1), (2, 1), (6, 2)]
我有一个相当简单的方法来使用 for 循环、临时变量和计数器来实现此目的:
result_list = []
current = source_list[0]
count = 0
for value in source_list:
if value == current:
count += 1
else:
result_list.append((current, count))
current = value
count = 1
result_list.append((current, count))
但我真的很喜欢python 的函数式编程习惯,我希望能够使用一个简单的生成器表达式来完成此操作。然而,我发现在使用生成器时很难保持子计数。我有一种感觉,两步过程可能会让我到达那里,但现在我被难住了。
有没有一种特别优雅/Pythonic 的方法来做到这一点,特别是对于生成器?
I've got a list of integers and I want to be able to identify contiguous blocks of duplicates: that is, I want to produce an order-preserving list of duples where each duples contains (int_in_question, number of occurrences).
For example, if I have a list like:
[0, 0, 0, 3, 3, 2, 5, 2, 6, 6]
I want the result to be:
[(0, 3), (3, 2), (2, 1), (5, 1), (2, 1), (6, 2)]
I have a fairly simple way of doing this with a for-loop, a temp, and a counter:
result_list = []
current = source_list[0]
count = 0
for value in source_list:
if value == current:
count += 1
else:
result_list.append((current, count))
current = value
count = 1
result_list.append((current, count))
But I really like python's functional programming idioms, and I'd like to be able to do this with a simple generator expression. However I find it difficult to keep sub-counts when working with generators. I have a feeling a two-step process might get me there, but for now I'm stumped.
Is there a particularly elegant/pythonic way to do this, especially with generators?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
正如他们所说,包含电池。
使用 JBernardo 的
sum
和生成器表达式的建议;见评论。Batteries included, as they say.
Suggestion for using
sum
and generator expression from JBernardo; see comment.