7 6 characters reduction by converting it to lambda.
source | link

Python 3Python 3, 77 6175 74 72 61 55 bytes

lambda e:('happy','sad')[e[-1]in'[(c<{'or e[0]in'])>}']
def f(e):return('happy','sad')[e[-1]in'[(c<{'or e[0]in'])>}']

Try it online!

  1. (77) Initial version... 77 bytes.

  2. (75) Saved 2 more bytes, because i found out that 'p' can be tuple instead of list.

  3. (74) Saved 1 byte by using sad faces instead of happy (me stupid:-D).

  4. (72) Saved 2 bytes by removing p variable and using the tuple directly in print().

  5. (61) Today I found a way to shorten it even more by making it a function, I'm not sure if it is allowed Thank you, @Dennis.

How does it work

If a face string starts with ])>} or ends with [(c<{, it is sad, otherwise it is happy. Tuple indexing is used as if.

Python 3, 77 61 bytes

def f(e):return('happy','sad')[e[-1]in'[(c<{'or e[0]in'])>}']
  1. (77) Initial version... 77 bytes.

  2. (75) Saved 2 more bytes, because i found out that 'p' can be tuple instead of list.

  3. (74) Saved 1 byte by using sad faces instead of happy (me stupid:-D).

  4. (72) Saved 2 bytes by removing p variable and using the tuple directly in print().

  5. (61) Today I found a way to shorten it even more by making it a function, I'm not sure if it is allowed Thank you, @Dennis.

Python 3, 77 75 74 72 61 55 bytes

lambda e:('happy','sad')[e[-1]in'[(c<{'or e[0]in'])>}']

Try it online!

How does it work

If a face string starts with ])>} or ends with [(c<{, it is sad, otherwise it is happy. Tuple indexing is used as if.

6 deleted 43 characters in body
source | link

Python 3, 77 7261 bytes

for edef inf(x,e):print(return('happy','sad')[e[-1]in'[(c<{'or e[0]in'])>}'])
  1. (77) Initial version... 77 bytes.

  2. (75) Saved 2 more bytes, because i found out that 'p' can be tuple instead of list.

  3. (74) Saved 1 byte by using sad faces instead of happy (me stupid:-D).

  4. (72) Saved 2 bytes by removing p variable and using the tuple directly in print().

  5. (61) Today I found a way to shorten it even more by making it a function, I'm not sure if it is allowed: def f(e):return('happy','sad')[e[-1]in'[(c<{'or e[0]in'])>}']I'm not sure if it is allowed Thank you, @Dennis.

Python 3, 77 72 bytes

for e in(x,):print(('happy','sad')[e[-1]in'[(c<{'or e[0]in'])>}'])
  1. (77) Initial version... 77 bytes.

  2. (75) Saved 2 more bytes, because i found out that 'p' can be tuple instead of list.

  3. (74) Saved 1 byte by using sad faces instead of happy (me stupid:-D).

  4. (72) Saved 2 bytes by removing p variable and using the tuple directly in print().

  5. (61) Today I found a way to shorten it even more by making it a function, I'm not sure if it is allowed: def f(e):return('happy','sad')[e[-1]in'[(c<{'or e[0]in'])>}']

Python 3, 77 61 bytes

def f(e):return('happy','sad')[e[-1]in'[(c<{'or e[0]in'])>}']
  1. (77) Initial version... 77 bytes.

  2. (75) Saved 2 more bytes, because i found out that 'p' can be tuple instead of list.

  3. (74) Saved 1 byte by using sad faces instead of happy (me stupid:-D).

  4. (72) Saved 2 bytes by removing p variable and using the tuple directly in print().

  5. (61) Today I found a way to shorten it even more by making it a function, I'm not sure if it is allowed Thank you, @Dennis.

5 added 183 characters in body
source | link

Python 3, 77 72 bytes

for e in(x,):print(('happy','sad')[e[-1]in'[(c<{'or e[0]in'])>}'])
  1. (77) Initial version... 77 bytes.

    (77) Initial version... 77 bytes.

  2. (75) Saved 2 more bytes, because i found out that 'p' can be tuple instead of list.

    (75) Saved 2 more bytes, because i found out that 'p' can be tuple instead of list.

  3. (74) Saved 1 byte by using sad faces instead of happy (me stupid:-D).

    (74) Saved 1 byte by using sad faces instead of happy (me stupid:-D).

  4. (72) Saved 2 bytes by removing p variable and using the tuple directly in print().

    (72) Saved 2 bytes by removing p variable and using the tuple directly in print().

  5. (61) Today I found a way to shorten it even more by making it a function, I'm not sure if it is allowed: def f(e):return('happy','sad')[e[-1]in'[(c<{'or e[0]in'])>}']

Python 3, 77 72 bytes

for e in(x,):print(('happy','sad')[e[-1]in'[(c<{'or e[0]in'])>}'])
  1. (77) Initial version... 77 bytes.
  2. (75) Saved 2 more bytes, because i found out that 'p' can be tuple instead of list.
  3. (74) Saved 1 byte by using sad faces instead of happy (me stupid:-D).
  4. (72) Saved 2 bytes by removing p variable and using the tuple directly in print().

Python 3, 77 72 bytes

for e in(x,):print(('happy','sad')[e[-1]in'[(c<{'or e[0]in'])>}'])
  1. (77) Initial version... 77 bytes.

  2. (75) Saved 2 more bytes, because i found out that 'p' can be tuple instead of list.

  3. (74) Saved 1 byte by using sad faces instead of happy (me stupid:-D).

  4. (72) Saved 2 bytes by removing p variable and using the tuple directly in print().

  5. (61) Today I found a way to shorten it even more by making it a function, I'm not sure if it is allowed: def f(e):return('happy','sad')[e[-1]in'[(c<{'or e[0]in'])>}']

4 Saved 2 bytes by removing p variable and using the tuple directly in print().
source | link
3 Saved 1 more byte by using sad faces instead of happy
source | link
2 Saved 2 bytes, because i found out that 'p' can be tuple instead of list.
source | link
1
source | link