Python Forum

Full Version: How to list number of times element is in defaultdict and delete it
You're currently viewing a stripped down version of our content. View the full version with proper formatting.
Goal:
if I see a certain value (example below is "0/1") listed more than 2 or more times I want:
1) Remove all respective items from the defaultdict value list.

I tried the example below from the documentation at python.org. No the example on the bottom would work for 'int'. Since this is a list, I am not sure how to proceed. Help is appreciated.

 
>>>
>>> l = defaultdict(list)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'defaultdict' is not defined
>>> from collections import defaultdict
>>> l = defaultdict(list)
>>> mylist=["0/1"]
>>> l['FAIL'].append(mylist)
>>> l
defaultdict(<class 'list'>, {'FAIL': [['0/1']]})
>>> mylist=["0/1"]
>>> l['FAIL'].append(mylist)
>>> l
defaultdict(<class 'list'>, {'FAIL': [['0/1'], ['0/1']]})
>>> mylist=["0/2"]
>>> l['FAIL'].append(mylist)
>>> l
defaultdict(<class 'list'>, {'FAIL': [['0/1'], ['0/1'], ['0/2']]})
>>> l.count("0/1")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>

>>> for k in l:
...     l[k] += 1
...
Traceback (most recent call last):
  File "<stdin>", line 2, in <module>
TypeError: 'int' object is not iterable   #since this is a list, is not working. Any ideas?
>>>
>>>
which example at python.org?
l = defaultdict(list)
is not going to work, so I think you copied incorrectly
Here. I am getting an error when I try.
https://docs.python.org/2/library/collec...efaultdict

Setting the default_factory to int makes the defaultdict useful for counting (like a bag or multiset in other languages):

>>> s = 'mississippi'
>>> d = defaultdict(int)
>>> for k in s:
... d[k] += 1
...
>>> d.items()
[('i', 4), ('p', 2), ('s', 4), ('m', 1)]
First of all - which Python version you are using? Python 3 is strongly recommended as support for Python 2 will end this year.

If you are using Python 3 then refer to correct documentation: defaultdict

Your code is not same as in documentation, therefore you dont 'follow' it. But your problem is:

In [1]: from collections import defaultdict                                                                                                                             

In [2]: l = defaultdict(list)                                                                                                                                           

In [3]: mylist=["0/1"]                                                                                                                                                  

In [4]: l['FAIL'].append(mylist)                                                                                                                                        

In [5]: l                                                                                                                                                               
Out[5]: defaultdict(list, {'FAIL': [['0/1']]})

In [6]: l['FAIL'].append(mylist)                                                                                                                                        

In [7]: l                                                                                                                                                               
Out[7]: defaultdict(list, {'FAIL': [['0/1'], ['0/1']]})

In [8]: l['FAIL'].append(["0/2"])                                                                                                                                       

In [9]: l                                                                                                                                                               
Out[9]: defaultdict(list, {'FAIL': [['0/1'], ['0/1'], ['0/2']]})

In [10]: l['FAIL'].count('0/1')                                                                                                                                           
Out[10]: 0                           # values are lists therefore count is zero

In [11]: l['FAIL'].count(['0/1'])                                                                                                                                        
Out[11]: 2                           # counting lists gives correct answer
Values are under key 'FAIL' and they are not strings but lists. So, in order to count you must give key and then count lists, not strings.