I am fairly new to python, but I haven't been able to find a solution to my problem anywhere.
I want to count the occurrences of a string inside a list of tuples.
Here is the list of tuples:
list1 = [
['12392', 'some string', 'some other string'],
['12392', 'some new string', 'some other string'],
['7862', None, 'some other string']
]
I've tried this but it just prints 0
for entry in list1:
print list1.count[entry[0]]
As the same ID occurs twice in the list, this should return:
2
1
I also tried to increment a counter for each occurrence of the same ID but couldn't quite grasp how to write it.
*EDIT: Using Eumiro's awesome answer. I just realized that I didn't explain the whole problem. I actually need the total amount of entries which has a value more than 1. But if I try doing:
for name, value in list1:
if value > 1:
print value
I get this error:
ValueError: Too many values to unpack
Cœur
35.6k24 gold badges188 silver badges257 bronze badges
asked Apr 15, 2013 at 10:59
Maybe collections.Counter
could solve your problem:
from collections import Counter
Counter[elem[0] for elem in list1]
returns
Counter[{'12392': 2, '7862': 1}]
It is fast since it iterates over your list just once. You iterate over entries and then try to get a count of these entries within your list. That cannot be done with .count
, but might be done as follows:
for entry in list1:
print[sum[1 for elem in list1 if elem[0] == entry[0]]]
But
seriously, have a look at collections.Counter
.
EDIT: I actually need the total amount of entries which has a value more than 1.
You can still use the Counter
:
c = Counter[elem[0] for elem in list1]
sum[v for k, v in c.iteritems[] if v > 1]
returns 2
, i.e. the sum of counts that are higher than 1.
answered Apr 15, 2013 at 11:01
eumiroeumiro
198k33 gold badges294 silver badges259 bronze badges
6
list1.count[entry[0]]
will not work because it looks at each of the three tuples in list1
, eg. ['12392', 'some string', 'some other string']
and checks if they are equal to '12392'
for example, which is obviously not the case.
@eurmiro's answer shows you how to do it with Counter
[which is the best way!] but here is a poor
man's version to illustrate how Counter
works using a dictionary and the dict.get[k, [,d]]
method which will attempt to get a key [k
], but if it doesn't exist it returns the default value instead [d
]:
>>> list1 = [
['12392', 'some string', 'some other string'],
['12392', 'some new string', 'some other string'],
['7862', None, 'some other string']
]
>>> d = {}
>>> for x, y, z in list1:
d[x] = d.get[x, 0] + 1
>>> d
{'12392': 2, '7862': 1}
answered Apr 15, 2013 at 11:11
jamylakjamylak
124k29 gold badges227 silver badges227 bronze badges
0
I needed some extra functionality that Counter didn't have. I have a list of tuples that the first element is the key and the second element is the amount to add. @jamylak solution was a great adaptation for this!
>>> list = [[0,5], [3,2], [2,1], [0,2], [3,4]]
>>> d = {}
>>> for x, y in list1:
d[x] = d.get[x, 0] + y
>>> d
{0: 7, 2: 1, 3: 6}
answered Jan 24, 2019 at 6:49