# TypeError: unhashable type: 'list' in constructing poset

I have the following code to generate all multiset partitions of a given multiset (list).

k0 = 2
k1 = 1
k2 = 1
#k3 = 1
l = k0+k1+k2 #+k3

L = [ ]
for i in range(k0) :
L.append(0)
for i in range(k1) :
L.append(1)
for i in range(k2) :
L.append(2)
print L
#L = [0,1,2,3]
LL = list(range(len(L)))
print LL
P = SetPartitions(LL)
P = list(P)

J = []
for p in P :
J.append([])
aa = P.index(p)
for i in p :
J[aa].append(list(i))
#print J

JJ =[]
for j in J :
JJ.append([])
bb = J.index(j)
for i in j :
JJ[bb].append([])
aa = j.index(i)
for k in i :
#print aa
JJ[bb][aa].append(L[k])
print JJ


The above code gives me the following output

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


I have the following code to generate a poset out of JJ in which the order is given by the refinement.

sage: elms = JJ
sage: def fcn(A, B):
....:     if len(A) != len(B) + 1:
....:         return False
....:     for a in A:
....:         if not any(set(a).issubset(b) for b in B):
....:             return False
....:     return True
sage: Poset((elms, fcn), cover_relations=True)


I usually work with sets and my input JJ is usually a set partition and the program works well.

Now, I am working with multisets (like [0,1,1,2,2,2,2]) and multi partitions (like [,[1,2],[1,2],[2,2]). By a multi-partition, I mean a partition in which each part is a multiset and parts can be repeated in a partition. So basically it is a list of lists. We cannot implement this using sets. I have codes given above to generate all such partitions in sage using lists.

Now, the set of all multi partitions JJ (which is implements as a list) of a multiset (which is also implemented as a list) has to be fed as an input to the above code to generate the poset. But the above code throws the error

 ---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-42-993ec557f50c> in <module>()
7             return False
8     return True
----> 9 Poset((elms, fcn), cover_relations=True)

/Applications/SageMath-8.1.app/Contents/Resources/sage/local/lib/python2.7/site-packages/sage/combinat/posets/posets.pyc in Poset(data, element_labels, cover_relations, linear_extension, category, facade, key)
674                         raise TypeError("not a list of relations")
675             D = DiGraph()
678         elif len(data) > 2:

9602
9603         """
9605
9606     def delete_vertex(self, vertex, in_order=False):

1504         for v in vertices:
1505             if v is not None:
1507             else:
1508                 nones += 1

1454             retval = name
1455
-> 1456         self.check_labelled_vertex(name,
1457                      (self._directed and
1458                       self._cg_rev is not None)) # this will add the vertex

/Applications/SageMath-8.1.app/Contents/Resources/sage/src/sage/graphs/base/c_graph.pyx in sage.graphs.base.c_graph.CGraphBackend.check_labelled_vertex (build/cythonized/sage/graphs/base/c_graph.c:12310)()
1153         cdef CGraph G_rev = self._cg_rev
1154
-> 1155         cdef int u_int = self.get_vertex(u)
1156         if u_int != -1:
1157             if not bitset_in(G.active_vertices, u_int):

/Applications/SageMath-8.1.app/Contents/Resources/sage/src/sage/graphs/base/c_graph.pyx in sage.graphs.base.c_graph.CGraphBackend.get_vertex (build/cythonized/sage/graphs/base/c_graph.c:11902)()
1120         cdef CGraph G = self._cg
1121         cdef long u_long
-> 1122         if u in vertex_ints:
1123             return vertex_ints[u]
1124         try:

TypeError: unhashable type: 'list'


How to overcome this issue? Kindly help me with this. Thank you.

edit retag close merge delete

• with M = [0, 1, 1, 2, 2, 2, 2] followed by the code in the question
• with M = [, [1, 2], [1, 2], [2, 2]] followed by the code in the question