Muszę zoptymalizować ten kod, który zasadniczo sprawdza, czy każda postać łańcucha s1 jest zawarta w s2, biorąc pod uwagę podwójnie.

s1, s2 = list(s1), list(s2)
for s in s2:
    if s in s1:
        s1.remove(s)
    else:
        return False
return True

Zrobiłem kilka badań na map, iteraterów i generatorach i jestem pewien, że w jednym lub więcej z nich istnieje rozwiązanie, ale teraz jestem dość zdezorientowany i sfrustrowany (jestem bardzo nowy w Pythonie, Zaledwie kilka tygodni), więc może możesz pomóc mi zrozumieć, jaka jest najlepsza strategia w tym przypadku. Dzięki!

2
AndTuf 2 lipiec 2017, 17:59

3 odpowiedzi

Najlepsza odpowiedź

Rozwiązanie przy użyciu {x0}}, który obsługuje powielane Znaki poprawnie:

from collections import Counter
c1 = Counter(s1)
c2 = Counter(s2)
return all(c2[c]>=c1[c] for c in c1)
3
Adrien Matissart 2 lipiec 2017, 15:16

Możesz policzyć liczbę zdarzeń każdej postaci w obu strunach. Nie musisz też robić ciągów listy: Struny są ich własnymi ieratorami.

Najpierw utwórz set, ponieważ zestawy mają przeciętny wygląd O(1). Następnie iteruj przez zestaw i zdobądź liczenia każdej postaci. Jeśli jakiekolwiek liczenia nie są równe, return False. Waży także znacznie lepiej, ponieważ rozmiar ciągu rośnie niż bieżące rozwiązanie:

s1 = 'Stack Overflow'
s2 = 'woltk fcrSeavO'

def equal_chars(s1, s2):
    chars = set(s2)
    for char in chars:
        if s1.count(char)!= s2.count(char):
            return False
    return True

print(equal_chars(s1, s2))
1
the_constant 2 lipiec 2017, 15:17

Niewielka regulacja wielkiej odpowiedzi Adrien, która jest (może?) Bardziej wydajna:

from collections import Counter

s1 = "hello"
s2 = "helo"

def count_chars(s1,s2):
    c2 = Counter(s2)
    for k,v in Counter(s1).items():
        if c2[k] < v:
            return False
    return True

print (count_chars(s1,s2))

Wynik:

False
0
ragardner 2 lipiec 2017, 15:42