您可以使用 Counter dict 获取计数,使用 OrderedDict 按键排序以获取 Order 中的计数以维护该顺序,并使用 dict.viewkeys 查找缺少的键。
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()
输出:
1 2 3 4
1 1 0 0
0 1 2 1
1 0 1 0
如果您不关心顺序,您可以删除 sorted/Ordereddict 逻辑:
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()
这会给你一个任意的顺序:
3 4 1 2
0 0 1 1
2 1 0 1
1 0 1 0
要写入 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