Isbister
Isbister

Reputation: 946

retrieve input of collections.Counter output

Not sure if the title is correct but.

Lets say you have a list that would look like the output from a Counter object.

[(-3.0, 4), (-2.0, 1), (-1.0, 1), (0.0, 1), (1.0, 1), (2.0, 1), (3.0, 4)]

How could I go back and get the original list, as

[-3.0, -3.0, -3.0, -3.0, -2.0, -1.0, 0.0, 1.0, 2.0, 3.0, 3.0, 3.0, 3.0]

Upvotes: 2

Views: 94

Answers (3)

user2390182
user2390182

Reputation: 73460

You can use the following nested comprehension:

lst = [(-3.0, 4), ..., (3.0, 4)]
[x for x, count in lst for _ in range(count)]
# [-3.0, -3.0, -3.0, -3.0, -2.0, -1.0, 0.0, 1.0, 2.0, 3.0, 3.0, 3.0, 3.0]

Upvotes: 3

Stefan Pochmann
Stefan Pochmann

Reputation: 28606

list(Counter(dict(a)).elements())

Demo:

>>> from collections import Counter
>>> a = [(-3.0, 4), (-2.0, 1), (-1.0, 1), (0.0, 1), (1.0, 1), (2.0, 1), (3.0, 4)]
>>> list(Counter(dict(a)).elements())
[-3.0, -3.0, -3.0, -3.0, -2.0, -1.0, 0.0, 1.0, 2.0, 3.0, 3.0, 3.0, 3.0]

So if you actually do have a Counter, just ask it for its elements directly.

Upvotes: 3

Ajax1234
Ajax1234

Reputation: 71451

You can try this:

s = [(-3.0, 4), (-2.0, 1), (-1.0, 1), (0.0, 1), (1.0, 1), (2.0, 1), (3.0, 4)]
final_s = [i for b in [[a]*b for a, b in s] for i in b]

Output:

[-3.0, -3.0, -3.0, -3.0, -2.0, -1.0, 0.0, 1.0, 2.0, 3.0, 3.0, 3.0, 3.0]

Upvotes: 2

Related Questions