If you don't care about multiple copies of the same triangle in different order then a list of tuples works:
[(n,nbr,nbr2) for n in G for nbr, nbr2 in itertools.combinations(G[n],2) if nbr in G[nbr2]]
The logic here is to check each pair of neighbors of every node to see if they are connected. G[n] is a fast way to iterate over or look up neighbors.
If you want to get rid of reorderings, turn each triple into a frozenset and make a set of the frozensets:
set(frozenset([n,nbr,nbr2]) for n in G for nbr, nbr2 in itertools.combinations(G[n]) if nbr in G[nbr2])
If you want a list of sets that are rid of reorderings then:
[set(triple) for triple in set(frozenset((n,nbr,nbr2)) for n in G for nbr, nbr2 in itertools.combinations(G[n],2) if nbr in G[nbr2])]
or perhaps for readably:
triangles = set(frozenset(n, nbr, nbr2)) for n in G for nbr, nbr2 in itertools.combinations(G[n],2) if nbr in G[nbr2])
nice_triangles = [set(tri) for tri in triangles]
The "set of frozensets" idiom is often used to remove duplicate groups from a list of groups.
To much fun.... :}