24
['a','a','b','c','c','c']

to

[2, 2, 1, 3, 3, 3]

and

{'a': 2, 'c': 3, 'b': 1}
3
  • 1
    I don't understand the question. Commented Mar 8, 2010 at 14:23
  • 3
    It would be most helpful to add at least one line of description. Commented Mar 8, 2010 at 14:28
  • this question is being asked every day for the last week Commented Mar 8, 2010 at 14:52

8 Answers 8

44
>>> x=['a','a','b','c','c','c']
>>> map(x.count,x)
[2, 2, 1, 3, 3, 3]
>>> dict(zip(x,map(x.count,x)))
{'a': 2, 'c': 3, 'b': 1}
>>>
Sign up to request clarification or add additional context in comments.

4 Comments

The result looks pretty, but it has potential O(n^2) runtime behaviour.
But he never said anything about performance... this solves the problem, if it's too inefficient that's a different problem to solve.
That is right -- but did you ever realize what can happen, wenn you run into the O(n^2)-trap? I experienced it, when a simple algorithm killed program performance totally because it happened to be a bigger dataset and the algorithm had such behaviour.
Relax. You're most likely writing O(n^3) and O(2^n) algorithms all the time, and never even notice them being executed. Solve those problems if they happen.
12

This coding should give the result:

from collections import defaultdict

myDict = defaultdict(int)

for x in mylist:
  myDict[x] += 1

Of course if you want the list inbetween result, just get the values from the dict (mydict.values()).

Comments

9

On Python ≥2.7 or ≥3.1, we have a built-in data structure collections.Counter to tally a list

>>> l = ['a','a','b','c','c','c']
>>> Counter(l)
Counter({'c': 3, 'a': 2, 'b': 1})

It is easy to build [2, 2, 1, 3, 3, 3] afterwards.

>>> c = _
>>> [c[i] for i in l]   # or map(c.__getitem__, l)
[2, 2, 1, 3, 3, 3]

Comments

6
a = ['a','a','b','c','c','c']
b = [a.count(x) for x in a]
c = dict(zip(a, b))

I've included Wim answer. Great idea

1 Comment

c = dict(zip(a, b)) should do it for computing c
6

Use a set to only count each item once, use the list method count to count them, store them in a dict with the item as key and the occurrence is value.

l=["a","a","b","c","c","c"]
d={}

for i in set(l):
    d[i] = l.count(i)

print d

Output:

{'a': 2, 'c': 3, 'b': 1}

2 Comments

for me this is the most simple to understand/implement. Do you know if its slower than using the collections Counter?
For such trivial examples, implement them both and time them. Don't trust my guesses. Or rather, don't care about the speed at all; you're using Python for simplicity, not performance.
3

Second one could be just

dict(zip(['a','a','b','c','c','c'], [2, 2, 1, 3, 3, 3]))

Comments

2

For the first one:

l = ['a','a','b','c','c','c']

map(l.count,l)

Comments

1
d=defaultdict(int)
for i in list_to_be_counted: d[i]+=1
l = [d[i] for i in list_to_be_counted]

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.