2017-11-03 86 views
6

Mam listę liter i klastrów liter, tak:Jak liczyć członków zestawu w łańcuchu w Pythonie?

['x', 'str', 'a', 'pr'] 

Mam ciąg znaków, który muszę wiedzieć ile łączne wystąpienia jakiegokolwiek członka liście są w nim:

paskiem = 1, liny = 0 ,, rprpraxp = 4 itd

teraz mogę pętli nad członkami zdarzeń lista liczenia każdego członka, a następnie wynieść je tak:

sublist = ['x', 'str', 'a', 'pr'] 
string = "rprpraxp" 
inst = 0 
for member in sublist: 
    inst = inst + string.count(member) 
print(inst) 

Jednak zastanawiam się, czy jestem brakuje krótszy, prostszy, bardziej intuicyjny i bardziej pythonic sposób liczenia członków zestawu przedmiotów w innym ciągiem, coś takiego:

inst = string.multicount(['x', 'str', 'a', 'pr']) 

coś takiego istnieje?

Dzięki.

+0

użyć pakietu 'collections' - patrz' counter' obiekt. – Prune

+2

Co jeśli łańcuchy zachodzą na siebie? Przykład: lista to ['ab', 'ba'], a ciąg to "aba". Czy odpowiedź 1 czy 2? – trincot

+0

Koduję mój tekst, aby się upewnić, że tak się nie stanie - ale dobry połów! – Sindyr

Odpowiedz

2

użyłbym map i sum:

sublist = ['x', 'str', 'a', 'pr'] 
string = "rprpraxp" 
print(sum(map(string.count, sublist))) 
+0

Widzę, że nadszedł czas, abym studiował teraz sumę i mapę! :) – Sindyr

+0

Ponieważ zestawy są szybsze? – Sindyr

+0

Tak, zestawy mają szybsze wyszukiwanie niż lista. Nie zauważysz żadnej różnicy w tym przypadku, ponieważ jest to mała lista ciągów znaków. Po prostu to wskazuję. Zmontowałem to, aby umieścić go na liście, chociaż w tym przypadku jest to zupełnie banalne. – scharette

0
>>> S = "rprpraxp" 
>>> L = ['x', 'str', 'a', 'pr'] 
>>> sum(S.count(e) for e in L if e in S) 
4 
+2

Czy nie dostaniesz tej samej odpowiedzi, jeśli pominiesz 'if e in S'? –

+0

@ Robᵩ: Pewnie. Może nawet być trochę szybciej. –