Write a function named `first_non_repeating_letter` that takes a string input, and returns the first character that is not repeated anywhere in the string.

For example, if given the input `'stress'`, the function should return `'t'`, since the letter *t* only occurs once in the string, and occurs first in the string.

As an added challenge, upper- and lowercase letters are considered the **same character**, but the function should return the correct case for the initial letter.  For example, the input `'sTreSS'` should return `'T'`.

If a string contains *all repeating characters*, it should return an empty string (`""`) or `None` -- see sample tests.

Difficulty: EASY
Tags: String algorithms

Starter code:
def first_non_repeating_letter(string):
	

Solutions:
def first_non_repeating_letter(string):
	string_lower = string.lower()
	for (i, letter) in enumerate(string_lower):
		if string_lower.count(letter) == 1:
			return string[i]
	return ''


from collections import Counter

def first_non_repeating_letter(string):
	cnt = Counter(string.lower())
	for letter in string:
		if cnt[letter.lower()] == 1:
			return letter
	return ''


def first_non_repeating_letter(string):
	singles = [i for i in string if string.lower().count(i.lower()) == 1]
	return singles[0] if singles else ''


def first_non_repeating_letter(string):
	s = string.lower()
	for i in string:
		if s.count(i.lower()) == 1:
			return i
	return ''


def first_non_repeating_letter(string):
	return next((x for x in string if string.lower().count(x.lower()) == 1), '')


def first_non_repeating_letter(string):
	return ([a for a in string if string.lower().count(a.lower()) == 1] or [''])[0]


def first_non_repeating_letter(string):
	for char in string:
		if string.lower().count(char.lower()) < 2:
			return char
	return ''


def first_non_repeating_letter(s):
	return ([c for c in s if s.lower().find(c.lower()) == s.lower().rfind(c.lower())] or [''])[0]


def first_non_repeating_letter(string):
	try:
		return next((c for c in string if string.lower().count(c.lower()) == 1))
	except StopIteration:
		return ''


def first_non_repeating_letter(string):
	counter = 0
	for x in string:
		for y in string.lower():
			if y == x.lower():
				counter += 1
		if counter == 1:
			return x
		counter = 0
	return ''


def first_non_repeating_letter(string):
	lowercase_str = string.lower()
	for i in string:
		if lowercase_str.count(i.lower()) == 1:
			return i
	return ''


from collections import Counter

def first_non_repeating_letter(string):
	count = Counter((s.lower() for s in string))
	for c in string:
		if count[c.lower()] == 1:
			return c
	return str()


def first_non_repeating_letter(string):
	result = sorted(string, key=lambda x: string.lower().count(x.lower())) + ['']
	return result[0] if result.count(result[0]) == 1 else result[-1]


def first_non_repeating_letter(string):
	return next((ch for ch in string if string.lower().count(ch.lower()) == 1), '')


def first_non_repeating_letter(s):
	seen = set()
	rep = set()
	for c in s:
		c = c.lower()
		if c in seen:
			rep.add(c)
		else:
			seen.add(c)
	for c in s:
		if c.lower() not in rep:
			return c
	return ''


def first_non_repeating_letter(string):
	for x in string:
		if x.lower() not in string.lower()[string.index(x) + 1:]:
			return x
	else:
		return ''


from collections import Counter

def first_non_repeating_letter(s):
	for (c, v) in sorted(Counter(s).most_common(), key=lambda t: t[1]):
		if v == 1 and c.swapcase() not in s or not c.isalpha():
			return c
	return ''


def first_non_repeating_letter(s):
	for c in s:
		if s.count(c) + s.count(c.swapcase()) * c.isalpha() == 1:
			return c
	return ''


def first_non_repeating_letter(str1):
	str2 = str1.lower()
	for c in str2:
		if str2.count(c) == 1:
			return str1[str2.index(c)]
	return ''


from collections import Counter

def first_non_repeating_letter(string):
	counts = Counter(string.lower())
	try:
		first_unique = next((item[0] for item in counts.items() if item[1] == 1))
	except StopIteration:
		return ''
	if first_unique.upper() in string:
		return first_unique.upper()
	else:
		return first_unique


def first_non_repeating_letter(string):
	str = string.lower()
	for x in str:
		if str.count(x) == 1:
			return string[str.index(x)]
	return ''


def first_non_repeating_letter(string):
	check_list = []
	list_string = list(string.lower())
	for let in string:
		if let not in check_list:
			list_string.remove(let.lower())
			check_list.append(let)
			if let.lower() not in list_string:
				return let
	return ''


def first_non_repeating_letter(string):
	c = ''
	if string == '':
		return ''
	count = 0
	b = string.lower()
	for i in b:
		a = b.count(i)
		if a == 1:
			break
		count += 1
		if count == len(string):
			return ''
	return string[count]


def first_non_repeating_letter(string):
	str = string.lower()
	for (i, v) in enumerate(str):
		if str.index(v) == str.rindex(v):
			return string[i]
	return ''


def first_non_repeating_letter(some_string):
	return ''.join([char if some_string.lower().count(char.lower()) == 1 else '' for char in some_string])[:1]


def first_non_repeating_letter(string):
	is_unique = lambda char: string.lower().count(char.lower()) == 1
	return next((char for char in string if is_unique(char)), '')


def first_non_repeating_letter(n):
	for i in n:
		if n.lower().count(i.lower()) == 1:
			return i
	return ''


def first_non_repeating_letter(string):
	low = string.lower()
	a = [ele for ele in dict.fromkeys(low) if low.count(ele) == 1]
	return string[low.index(a[0])] if a and string else ''


def first_non_repeating_letter(string):
	return ''.join((i for i in string if string.lower().count(i.lower()) == 1))[:1]


def first_non_repeating_letter(string):
	cass = ''.join(string)
	chars = list((i.lower().replace(' ', '') for i in cass))
	newList = []
	for (char, i) in zip(chars, string):
		count = chars.count(char)
		if count >= 2:
			continue
		else:
			newList.append(i)
	if len(newList) > 0:
		return str(newList[0])
	else:
		return ''


def first_non_repeating_letter(string):
	strLower = string.lower()
	for let in string:
		if strLower.count(let.lower()) == 1:
			return let
	return ''


def first_non_repeating_letter(string):
	print(string)
	for l in string:
		if string.lower().find(l.lower(), string.find(l) + 1) == -1:
			return l
	return ''


def first_non_repeating_letter(string):
	c = [x for x in string if string.lower().count(x.lower()) == 1]
	if c:
		return c[0]
	else:
		return ''


def first_non_repeating_letter(string):
	if len(string) == 1 or len(string) == 0:
		return string
	for leter in string:
		if leter.lower() not in string[string.index(leter) + 1:].lower() and leter.lower() not in string[:string.index(leter)].lower():
			return leter
	else:
		return ''


def first_non_repeating_letter(string):
	a = [i for i in string.lower()]
	b = 0
	c = [i for i in string]
	if len(string) == 1:
		return string
	while b < len(a) - 1:
		if a.count(a[b]) == 1:
			return c[b]
		else:
			b += 1
	return ''


def first_non_repeating_letter(string):
	if all([string.count(item) > 1 for item in string]):
		return ''
	for (i, item) in enumerate(string.upper()):
		if string.upper().count(item) == 1:
			return string[i]