```# here is a topological icosahedron, expressed as openings (faces)

# Note: I recycled this from my rbf.py but changed the letters to

# something friendlier

baseicosa = [('A', 'C', 'I'),
('A', 'L', 'B'),
('B', 'D', 'K'),
('D', 'C', 'J'),
('I', 'E', 'G'),
('G', 'J', 'H'),
('K', 'F', 'H'),
('L', 'F', 'E'),
('A', 'B', 'D'),
('A', 'C', 'D'),
('A', 'L', 'I'),
('I', 'E', 'L'),
('C', 'I', 'G'),
('C', 'G', 'J'),
('L', 'B', 'F'),
('K', 'B', 'F'),
('D', 'K', 'J'),
('H', 'K', 'J'),
('F', 'E', 'H'),
('G', 'E', 'H')]

# we will consider these the names of 12 pentagons then add a

# 'soccer ball' pattern of 20 hexagons, named for the pentagons

# at their 3 alternate edges, e.g. hexagon ACI.

# Every hexagon will have six neighbors:  three pentagons with

# one letter in common, three hexagons with two letters is common

# Every pentagon with have five neighbors:  five hexagons with

# one letter in common.

pents = ['A','B','C','D','E','F','G','H','I','J','K','L']  # 20

print "Pents: %s" % pents

def gethexes():
thelist = []
for t in baseicosa:
thehex = ''.join(sorted(t))
thelist.append(thehex)
return thelist

hexes = gethexes()
print "Hexes: %s" % hexes

# and let's get the edges while we're at it.  Every edge of every

# triangle is an edge.  We'll use the set data structure to police

# against duplicates

def getedges():
theset = set()
for t in baseicosa:
for i in (t[:2], t[1:], t[-1]+t[0]):
return sorted(list(theset))

edges = getedges()
print "Edges: %s" % edges

# now we'd like a global dictionary in which every pentagon is paired

# with its 5 neighbors.  These will simply be all hexagons with

# a letter in common.

globaldata = {}

def buildpents():
result = {}
for p in pents:
neighbors = []
for h in hexes:
if p in h:
neighbors.append(h)
result[p] = neighbors
return result

result = buildpents()
print "Pent neighbors: %s" % result
globaldata.update(result)

# adding to our globaldata, will be all the hexagons paired with

# their six neighbors:  3 pentagons, and 3 hexagons across an edge.

# We detect edge sharing as a boundary condition, i.e. if a panel

# has two (and only two) letters in common, it's across an edge

def buildhexes():
result = {}
for h in hexes:
neighbors = list(h) # 3 pentagons

for candidate in hexes:
for i in range(3):
if h[i] in candidate:
`# code highlighted using py2html.py version 0.8`