<div dir="ltr"><div><div>Well here is some code I wrote recently to build a histogram over a weighted graph, before becoming aware that Counter existed (score is a float here):<br><br>from collections import defaultdict<br><br>total_score_by_depth = defaultdict(float)<br>total_items_by_depth = defaultdict(int)<br>num_nodes_by_score = defaultdict(int)<br>num_nodes_by_log_score = defaultdict(int)<br>num_edges_by_score = defaultdict(int)<br>for state in iter_graph_components():<br>    try:<br>        # There is probably some overlap here<br>        ak = state['ak']<br>        _, c = ak.score_paths(max_depth=15)<br>        for edge in state['graph'].edges:<br>            num_edges_by_score[np.ceil(20.0 * edge.score) / 20.0] += 1<br>        for node in c.nodes:<br>            total_score_by_depth[node.depth] += node.score<br>            total_items_by_depth[node.depth] += 1<br>            num_nodes_by_score[np.ceil(20.0 * node.score) / 20.0] += 1<br>            num_nodes_by_log_score[np.ceil(-np.log10(node.score))] += 1<br>        num_nodes_by_score[0.0] += len(state['graph'].nodes) - len(c.nodes)<br>        num_nodes_by_log_score[100.0] += len(state['graph'].nodes) - len(c.nodes)<br>    except MemoryError:<br>        print("Skipped massive.")<br><br></div>Without going too much into what this does, note that I could replace the other defaultdicts with Counters, but I can't do the same thing with a total_score_by_depth, at least not without violating the API. I would suggest that with a name like Counter, treating a class like a Counter should be the more common use case. If it's meant to be a multiset, we should call it a Multiset. Here is an example from Stack Overflow of someone else also wanting a float counter, and the only suggestion being to use defaultdict:</div><div><br></div><div><a href="https://stackoverflow.com/questions/10900207/any-way-to-tackle-float-counter-values-in-python">https://stackoverflow.com/questions/10900207/any-way-to-tackle-float-counter-values-in-python</a></div><div><br></div></div><br><div class="gmail_quote"><div dir="ltr">On Tue, Dec 19, 2017 at 3:08 AM Paul Moore <<a href="mailto:p.f.moore@gmail.com">p.f.moore@gmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">On 18 December 2017 at 23:51, Joel Croteau <<a href="mailto:jcroteau@gmail.com" target="_blank">jcroteau@gmail.com</a>> wrote:<br>
> It would be useful in many scenarios for values in collections.Counter to be<br>
> allowed to be floating point.<br>
<br>
Do you have any evidence of this? Code examples that would be<br>
significantly improved by such a change?  I can't think of any myself.<br>
<br>
I might consider writing<br>
<br>
    totals - defaultdict(float)<br>
    for ...:<br>
        totals[something] = calculation(something)<br>
<br>
but using a counter is neither noticeably easier, nor clearer...<br>
<br>
One way of demonstrating such a need would be if your proposed<br>
behaviour were available on PyPI and getting used a lot - I'm not<br>
aware of any such module if it is.<br>
<br>
Paul<br>
</blockquote></div>