You can get the counts using a Counter dict, sort by key to get the counts in Order using an OrderedDict to maintain that order and use dict.viewkeys
to find what keys are missing.
from __future__ import print_function
from collections import Counter, OrderedDict
from itertools import chain
check_list = [[[('1',), ('2',)]], [[('2',), ('3',)], [('3',), ('4',)]], [[('1',), ('3',)]]]
a_list = [('1',), ('2',), ('3',), ('4',)]
cn = OrderedDict(sorted(Counter(a_list).items()))
print(" ".join([str(t[0]) for t in cn]))
for chk in check_list:
_cn = Counter(chain(*chk))
# cn.keys() python 3
diff = cn.viewkeys() - _cn
for k in cn:
if k not in diff:
print(_cn[k], end=" ")
else:
print(0, end=" ")
print()
Output:
1 2 3 4
1 1 0 0
0 1 2 1
1 0 1 0
If you don't care about the order you can remove the sorted/Ordereddict logic:
from collections import Counter
from itertools import chain
check_list = [[[('1',), ('2',)]], [[('2',), ('3',)], [('3',), ('4',)]], [[('1',), ('3',)]]]
a_list = [('1',), ('2',), ('3',), ('4',)]
cn = Counter(a_list)
print(" ".join([str(t[0]) for t in cn]))
for chk in check_list:
_cn = Counter(chain(*chk))
diff = cn.viewkeys() - _cn
for k in cn:
if k not in diff:
print(_cn[k], end=" ")
else:
print(0, end=" ")
print()
That will give you an arbitrary order:
3 4 1 2
0 0 1 1
2 1 0 1
1 0 1 0
To write to a csv:
from collections import Counter, OrderedDict
from itertools import chain
from csv import writer
check_list = [[[('1',), ('2',)]], [[('2',), ('3',)], [('3',), ('4',)]], [[('1',), ('3',)]]]
a_list = [('1',), ('2',), ('3',), ('4',)]
with open("out.csv","w") as out:
wr = writer(out,delimiter=" ")
cn = OrderedDict(sorted(Counter(a_list).items()))
wr.writerow(list(chain(*cn)))
for chk in check_list:
_cn = Counter(chain(*chk))
diff = cn.viewkeys() - _cn
wr.writerow([_cn[k] if k not in diff else 0 for k in cn])
out.csv:
1 2 3 4
1 1 0 0
0 1 2 1
1 0 1 0