lista i słownik - problemik

0

Cześć, mam problem ze zrozumieniem dlaczego poniższy kod nie chce działać tak, jak sobie tego życzę.
Otóż jest lista ze stringami i jest słownik z dwoma parami key:value.
Wyjściowa lista powinna zawierać wszystkie stringi (w tym przypadku dwa: ['qaw', 'qxw']) które odpowiadają danym ze słownika, czyli że pod indeksem 0 powinna być litera 'q', a pod indeksem 2 litera 'w'

lst = ['qaw', 'qea', 'qrz', 'awq', 'swq', 'qxw', 'dwq']
dct = {0 : 'q', 2 : 'w'}
out = []

for item in lst:
	for k,v in dct.items():
		if item[k] == v:
			out.append(item)

print(out)

Wykonanie powyższego kodu da wynik ['qaw', 'qaw', 'qea' , 'qrz', 'qxw', 'qxw'].
Jeśli słownik posiadał by tylko jedną wartość np {0:'q'} (lub jakąkolwiek inną) to na wyjściu będzie to czego można się spodziewać, czyli wszystkie stringi zaczynające się na 'q', ale nie wiem jak zrobić aby wszystkie warunki ze słownika były spełnione, zakładając że może być ich więcej niż próbowane przeze nie dwa.

Gdzie jest błąd?

0

Taki x = 'qaw' ci się dopasowuje 2 razy ponieważ zarówno x[0] == 'q' jak i x[2] == 'w'. Poza tym wstawiasz element jeżeli dowolny warunek jest spełniony, a chcesz by spełnione były wszystkie.

Proponuję użyć modułu fnmatch aby stworzyć sobie wzorzec do dopasowania, gdzie znak ? dopasowuje dowolny znak:

import fnmatch

lst = ['qaw', 'qea', 'qrz', 'awq', 'swq', 'qxw', 'dwq']
dct = {0 : 'q', 2 : 'w'}
out = []

pattern = ''.join(dct.get(i, '?') for i in range(3)) # pattern = 'q?w'
for item in lst:
    if fnmatch.fnmatch(item, pattern):
        out.append(item)

print(out)

Alternatywnie możesz użyć all aby sprawdzać wszystkie warunki

lst = ['qaw', 'qea', 'qrz', 'awq', 'swq', 'qxw', 'dwq']
dct = {0 : 'q', 2 : 'w'}
out = []

for item in lst:
    if all(item[k]==v for k, v in dct.items()):
        out.append(item)

print(out)
0

Dziękuję. Teraz widzę swój błąd. Najbardziej satysfakcjonuje mnie druga odpowiedź nic nie importująca :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1