Apa yang Anda maksud dengan "jumlah substring"? Posisi substring? Berapa kali substring terjadi? Sesuatu yang lain
GreenMatt
2
Apakah ini tugas pekerjaan rumah? Jika demikian, tambahkan tag "pekerjaan rumah" ke pertanyaan Anda. Juga, pertanyaan Anda tidak terlalu jelas. Saya akan menjawab apa yang tampaknya Anda tanyakan, tetapi saya curiga Anda benar-benar ingin mencari tahu hal lain.
Seperti yang ditunjukkan dalam komentar, ini adalah cara untuk melakukannya untuk kejadian yang tidak tumpang tindih . Jika Anda perlu menghitung kejadian yang tumpang tindih, Anda sebaiknya memeriksa jawabannya di: " Python regex menemukan semua kecocokan yang tumpang tindih? ", Atau cukup periksa jawaban saya yang lain di bawah ini.
Bagaimana dengan ini: "GCAAAAAG".count("AAA")yang memberi 1, sedangkan jawaban yang benar adalah 3?
kartunis
12
countjelas untuk pertandingan yang tidak tumpang tindih - yang paling sering ingin dilakukan seseorang. stackoverflow.com/questions/5616822/… berurusan dengan pertandingan yang tumpang tindih - tapi ekspresi sederhana, jika mahal, adalah:sum("GCAAAAAGH"[i:].startswith("AAA") for i in range(len("GCAAAAAGH")))
jsbueno
Apakah mungkin menghitung / mencari beberapa kata sekaligus? seperti string.count (substring1, substring2)
Sushant Kulkarni
@SushantKulkarni No. Meskipun ada satu cara yang logis untuk melakukan hal tersebut: string.count(substring1) + string.count(substring2). Tetapi perlu diingat bahwa ini bukan metode yang efisien jika ada banyak substring karena menghitung setiap substring memerlukan iterasi atas string utama.
Faheel
@SushantKulkarni melakukan ''.join([substring1, substring2]).count(pattern)lebih efisien daripada solusi yang disarankan di atas. Saya diperiksa menggunakan timeit.
Enric Calabuig
23
s ='arunununghhjj'
sb ='nun'
results =0
sub_len = len(sb)for i in range(len(s)):if s[i:i+sub_len]== sb:
results +=1print results
Saya kira Anda bermaksud s.find("su")dan bertanya-tanya mengapa Anda mendapatkannya 0? Nah ini adalah indeks pertama dari sub-string "su"di s. Coba "ub"dan Anda akan mendapatkan 1, coba misalnya "z"dan Anda akan mendapatkan -1tidak ditemukan di substring.
Don Question
Maksud saya Anda selalu menemukan hanya indeks pertama, tetapi tidak semua indeks, @ arun-kumar-khattri memberikan jawaban yang benar
obohovyk
Saya lega bahwa @ arun-kumar-khattri memberikan jawaban "benar" yang Anda cari. Mungkin Anda harus melihat komentar jsbueno, terkadang mereka menjawab pertanyaan yang belum Anda tanyakan.
Don Question
Seperti untuk pendekatan ketiga. BTW, saya pikir Anda harus menyebutkan bahwa itu berfungsi untuk kasus yang tidak tumpang tindih.
Zeinab Abbasimazar
12
Cara terbaik untuk menemukan sub-string yang tumpang tindih dalam string yang diberikan adalah dengan menggunakan ekspresi reguler python, itu akan menemukan semua pencocokan yang tumpang tindih menggunakan perpustakaan ekspresi reguler. Berikut adalah cara melakukannya adalah substring dan di sebelah kanan Anda akan memberikan string yang cocok
Kiat kecil: Alih-alih mengatakan "Ini berhasil karena saya memeriksanya", Anda dapat menyertakan contoh pada layanan online seperti repl.it dengan beberapa data sampel.
Valentin
1
terima kasih atas komentar Anda Valentin! Ini jawaban pertamaku di sini. Saya akan meningkatkan diri dari jawaban saya berikutnya.
Bharath Kumar R
10
Anda dapat menghitung frekuensi menggunakan dua cara:
Menggunakan count()in str:
a.count(b)
Atau, Anda dapat menggunakan:
len(a.split(b))-1
Di mana astring dan bmerupakan substring yang frekuensinya harus dihitung.
Jawaban terbaik yang melibatkan metode saat countini tidak benar-benar diperhitungkan untuk kejadian yang tumpang tindih dan tidak peduli tentang sub-string kosong juga. Sebagai contoh:
>>> a ='caatatab'>>> b ='ata'>>>print(a.count(b))#overlapping1>>>print(a.count(''))#empty string9
Jawaban pertama seharusnya 2tidak 1, jika kita mempertimbangkan substring yang tumpang tindih. Adapun jawaban kedua lebih baik jika sub-string kosong mengembalikan 0 sebagai asnwer.
apakah kita benar-benar memerlukan pemeriksaan ini jika (string [j] == sub_string [0]):? bukankah itu secara otomatis tercakup dalam kondisi jika berikutnya?
AnandViswanathan89
AnandViswanathan89, Kedua jika kondisi diperlukan, jika (string [j] == sub_string [0]) memeriksa kecocokan karakter awal dalam string utama, yang harus dilakukan untuk seluruh karakter string utama dan jika (string [ j: j + len2] == sub_string) melakukan kemunculan substring. Jika itu untuk kejadian pertama maka yang kedua jika kondisi sudah mencukupi.
Amith VV
4
Pertanyaannya tidak terlalu jelas, tetapi saya akan menjawab apa Anda, di permukaan, bertanya.
Sebuah string S, yang panjang karakter L, dan di mana S [1] adalah karakter pertama dari string dan S [L] adalah karakter terakhir, memiliki substring berikut:
String nol ''. Ada satu di antaranya.
Untuk setiap nilai A dari 1 hingga L, untuk setiap nilai B dari A ke L, string S [A] .. S [B] (inklusif). Ada L + L-1 + L-2 + ... 1 dari string ini, dengan total 0,5 * L * (L + 1).
Perhatikan bahwa item kedua termasuk S [1] .. S [L], yaitu seluruh string asli S.
Jadi, ada 0,5 * L * (L + 1) + 1 substring dalam string panjang L. Render ekspresi itu dalam Python, dan Anda memiliki jumlah substring hadir dalam string.
Kata untuk saya, terima kasih. @ antosh, mengapa tidak menerima jawaban?
Mawg mengatakan mengembalikan Monica
2
Saya akan menjaga jawaban yang saya terima sebagai "cara sederhana dan jelas untuk melakukannya" - namun, itu tidak mencakup kejadian yang tumpang tindih. Mengetahui hal itu dapat dilakukan secara naif, dengan memeriksa beberapa irisan - seperti dalam: jumlah ("GCAAAAAGH" [i:]. Startswith ("AAA") untuk i dalam jangkauan (len ("GCAAAAAGH"))))
(Yang menghasilkan 3) - itu dapat dilakukan dengan trik menggunakan ekspresi reguler, seperti yang dapat dilihat di Python regex menemukan semua kecocokan yang tumpang tindih? - dan itu juga dapat membuat golf kode yang bagus - Ini adalah hitungan "buatan tangan" saya karena tumpang tindih pola-pola dalam string yang mencoba tidak terlalu naif (setidaknya tidak membuat objek string baru di setiap interaksi):
def olpcount(string,pattern,case_sensitive=True):if case_sensitive !=True:
string = string.lower()
pattern = pattern.lower()
l = len(pattern)
ct =0for c in range(0,len(string)):if string[c:c+l]== pattern:
ct +=1return ct
test ='my maaather lies over the oceaaan'print test
print olpcount(test,'a')print olpcount(test,'aa')print olpcount(test,'aaa')
Bagaimana dengan one-liner dengan pemahaman daftar? Secara teknis 93 karakternya panjang, lepaskan saya purisme PEP-8. Jawaban regex.findall adalah yang paling mudah dibaca jika merupakan kode tingkat tinggi. Jika Anda sedang membangun sesuatu tingkat rendah dan tidak ingin ketergantungan, yang ini sangat ramping dan kejam. Saya memberikan jawaban yang tumpang tindih. Tentunya gunakan saja hitungan seperti jawaban skor tertinggi jika tidak ada tumpang tindih.
def count_substring(string, sub_string):return len([i for i in range(len(string))if string[i:i+len(sub_string)]== sub_string])
Jika Anda ingin mengetahui jumlah substring di dalam string apa pun; silakan gunakan kode di bawah ini. Kode ini mudah dimengerti karena itu saya melewatkan komentar. :)
string="abc"
mainstr="ncnabckjdjkabcxcxccccxcxcabc"
count=0for i in range(0,len(mainstr)):
k=0while(k<len(string)):if(string[k]==mainstr[i+k]):
k+=1else:breakif(k==len(string)):
count+=1;print(count)
Mungkin Anda bisa menguraikan bagaimana solusi ini berbeda dari yang lain, apakah ada kasus khusus yang dapat diselesaikan?
mpaskov
2
Sementara kode ini dapat menjawab pertanyaan, memberikan konteks tambahan tentang bagaimana dan / atau mengapa memecahkan masalah akan meningkatkan nilai jangka panjang jawaban.
Donald Duck
0
import re
d =[m.start()for m in re.finditer(seaching, string)]print(d)
Ini menemukan berapa kali sub string ditemukan dalam string dan menampilkan indeks.
import re d = [m.start () untuk m di re.finditer (st3, st2)] #mencari berapa kali sub string ditemukan dalam string dan tampilkan indeks cetak (d)
Bhaskar Reddi K
0
my_string ="""Strings are amongst the most popular data types in Python.
We can create the strings by enclosing characters in quotes.
Python treats single quotes the same as double quotes."""Count= my_string.lower().strip("\n").split(" ").count("string")Count= my_string.lower().strip("\n").split(" ").count("strings")print("The number of occurance of word String is : ",Count)print("The number of occurance of word Strings is : ",Count)
Mempertaruhkan downvote karena 2+ orang lain telah menyediakan solusi ini. Saya bahkan membatalkan salah satu dari mereka. Tapi milikku mungkin yang paling mudah dipahami oleh pemula.
Untuk string sederhana dengan batasan ruang, menggunakan Dict akan cukup cepat, silakan lihat kode seperti di bawah ini
def getStringCount(mnstr:str, sbstr:str='')->int:""" Assumes two inputs string giving the string and
substring to look for number of occurances
Returns the number of occurances of a given string
"""
x = dict()
x[sbstr]=0
sbstr = sbstr.strip()for st in mnstr.split(' '):if st notin[sbstr]:continuetry:
x[st]+=1exceptKeyError:
x[st]=1return x[sbstr]
s ='foo bar foo test one two three foo bar'
getStringCount(s,'foo')
Logika di bawah ini akan berfungsi untuk semua karakter string & khusus
def cnt_substr(inp_str, sub_str):
inp_join_str =''.join(inp_str.split())
sub_join_str =''.join(sub_str.split())return inp_join_str.count(sub_join_str)print(cnt_substr("the sky is $blue and not greenthe sky is $blue and not green","the sky"))
Sementara semua jawaban dihargai, kode hanya jawaban cenderung tidak menjelaskan subjek dengan sangat baik. Harap tambahkan beberapa konteks.
creyD
0
#counting occurence of a substring in another string (overlapping/non overlapping)
s = input('enter the main string: ')# e.g.'bobazcbobobegbobobgbobobhaklpbobawanbobobobob'
p=input('enter the substring: ')# e.g.'bob'
counter=0
c=0for i in range(len(s)-len(p)+1):for j in range(len(p)):if s[i+j]==p[j]:if c<len(p):
c=c+1if c==len(p):
counter+=1
c=0breakcontinueelse:breakprint('number of occurences of the substring in the main string is: ',counter)
Silakan pertimbangkan untuk menambahkan setidaknya beberapa penjelasan seolah-olah mengapa ini menjawab pertanyaan
β.εηοιτ.βε
0
Inilah solusi yang berfungsi untuk kejadian yang tidak tumpang tindih dan tumpang tindih. Untuk memperjelas: substring yang tumpang tindih adalah yang karakter terakhirnya identik dengan karakter pertamanya.
def substr_count(st, sub):# If a non-overlapping substring then just# use the standard string `count` method# to count the substring occurencesif sub[0]!= sub[-1]:return st.count(sub)# Otherwise, create a copy of the source string,# and starting from the index of the first occurence# of the substring, adjust the source string to start# from subsequent occurences of the substring and keep# keep count of these occurences
_st = st[::]
start = _st.index(sub)
cnt =0while start isnotNone:
cnt +=1try:
_st = _st[start + len(sub)-1:]
start = _st.index(sub)except(ValueError,IndexError):return cnt
return cnt
Jawaban:
string.count(substring)
, seperti di:Memperbarui:
Seperti yang ditunjukkan dalam komentar, ini adalah cara untuk melakukannya untuk kejadian yang tidak tumpang tindih . Jika Anda perlu menghitung kejadian yang tumpang tindih, Anda sebaiknya memeriksa jawabannya di: " Python regex menemukan semua kecocokan yang tumpang tindih? ", Atau cukup periksa jawaban saya yang lain di bawah ini.
sumber
"GCAAAAAG".count("AAA")
yang memberi 1, sedangkan jawaban yang benar adalah 3?count
jelas untuk pertandingan yang tidak tumpang tindih - yang paling sering ingin dilakukan seseorang. stackoverflow.com/questions/5616822/… berurusan dengan pertandingan yang tumpang tindih - tapi ekspresi sederhana, jika mahal, adalah:sum("GCAAAAAGH"[i:].startswith("AAA") for i in range(len("GCAAAAAGH")))
string.count(substring1) + string.count(substring2)
. Tetapi perlu diingat bahwa ini bukan metode yang efisien jika ada banyak substring karena menghitung setiap substring memerlukan iterasi atas string utama.''.join([substring1, substring2]).count(pattern)
lebih efisien daripada solusi yang disarankan di atas. Saya diperiksa menggunakan timeit.sumber
Tergantung apa yang Anda maksud, saya mengusulkan solusi berikut:
Maksud Anda daftar sub-string yang dipisahkan ruang dan ingin tahu apa nomor posisi sub-string di antara semua sub-string:
Maksud Anda posisi char dari sub-string dalam string:
Anda berarti (non-overlapping) jumlah penampilan dari su-bstring:
sumber
s.find("su")
dan bertanya-tanya mengapa Anda mendapatkannya0
? Nah ini adalah indeks pertama dari sub-string"su"
dis
. Coba"ub"
dan Anda akan mendapatkan1
, coba misalnya"z"
dan Anda akan mendapatkan-1
tidak ditemukan di substring.Cara terbaik untuk menemukan sub-string yang tumpang tindih dalam string yang diberikan adalah dengan menggunakan ekspresi reguler python, itu akan menemukan semua pencocokan yang tumpang tindih menggunakan perpustakaan ekspresi reguler. Berikut adalah cara melakukannya adalah substring dan di sebelah kanan Anda akan memberikan string yang cocok
sumber
Untuk menemukan kejadian substring yang tumpang tindih dalam string dengan Python 3, algoritma ini akan melakukan:
Saya sendiri memeriksa algoritme ini dan berhasil.
sumber
Anda dapat menghitung frekuensi menggunakan dua cara:
Menggunakan
count()
instr
:a.count(b)
Atau, Anda dapat menggunakan:
len(a.split(b))-1
Di mana
a
string danb
merupakan substring yang frekuensinya harus dihitung.sumber
Jawaban terbaik yang melibatkan metode saat
count
ini tidak benar-benar diperhitungkan untuk kejadian yang tumpang tindih dan tidak peduli tentang sub-string kosong juga. Sebagai contoh:Jawaban pertama seharusnya
2
tidak1
, jika kita mempertimbangkan substring yang tumpang tindih. Adapun jawaban kedua lebih baik jika sub-string kosong mengembalikan 0 sebagai asnwer.Kode berikut menangani hal-hal ini.
Sekarang ketika kita menjalankannya:
sumber
Skenario 1: Kejadian kata dalam sebuah kalimat. misalnya:
str1 = "This is an example and is easy"
. Kemunculan kata "is". maristr2 = "is"
Skenario 2: Kejadian pola dalam sebuah kalimat.
Terima kasih!
sumber
Pertanyaannya tidak terlalu jelas, tetapi saya akan menjawab apa Anda, di permukaan, bertanya.
Sebuah string S, yang panjang karakter L, dan di mana S [1] adalah karakter pertama dari string dan S [L] adalah karakter terakhir, memiliki substring berikut:
Jadi, ada 0,5 * L * (L + 1) + 1 substring dalam string panjang L. Render ekspresi itu dalam Python, dan Anda memiliki jumlah substring hadir dalam string.
sumber
Salah satu caranya adalah menggunakan
re.subn
. Misalnya, untuk menghitung jumlah kemunculan'hello'
dalam berbagai kasus yang dapat Anda lakukan:sumber
Saya akan menjaga jawaban yang saya terima sebagai "cara sederhana dan jelas untuk melakukannya" - namun, itu tidak mencakup kejadian yang tumpang tindih. Mengetahui hal itu dapat dilakukan secara naif, dengan memeriksa beberapa irisan - seperti dalam: jumlah ("GCAAAAAGH" [i:]. Startswith ("AAA") untuk i dalam jangkauan (len ("GCAAAAAGH"))))
(Yang menghasilkan 3) - itu dapat dilakukan dengan trik menggunakan ekspresi reguler, seperti yang dapat dilihat di Python regex menemukan semua kecocokan yang tumpang tindih? - dan itu juga dapat membuat golf kode yang bagus - Ini adalah hitungan "buatan tangan" saya karena tumpang tindih pola-pola dalam string yang mencoba tidak terlalu naif (setidaknya tidak membuat objek string baru di setiap interaksi):
sumber
Kejadian yang tumpang tindih:
Hasil:
sumber
Untuk jumlah yang tumpang tindih kita dapat menggunakan use:
Untuk kasus yang tidak tumpang tindih kita dapat menggunakan fungsi count ():
sumber
Bagaimana dengan one-liner dengan pemahaman daftar? Secara teknis 93 karakternya panjang, lepaskan saya purisme PEP-8. Jawaban regex.findall adalah yang paling mudah dibaca jika merupakan kode tingkat tinggi. Jika Anda sedang membangun sesuatu tingkat rendah dan tidak ingin ketergantungan, yang ini sangat ramping dan kejam. Saya memberikan jawaban yang tumpang tindih. Tentunya gunakan saja hitungan seperti jawaban skor tertinggi jika tidak ada tumpang tindih.
sumber
Jika Anda ingin menghitung semua sub-string (termasuk tumpang tindih) maka gunakan metode ini.
sumber
Jika Anda ingin mengetahui jumlah substring di dalam string apa pun; silakan gunakan kode di bawah ini. Kode ini mudah dimengerti karena itu saya melewatkan komentar. :)
sumber
Saya tidak yakin apakah ini sesuatu yang sudah dilihat, tetapi saya menganggap ini sebagai solusi untuk kata yang 'sekali pakai':
Di mana kata adalah kata yang Anda cari dan istilah adalah istilah yang Anda cari
sumber
sumber
Ini menemukan berapa kali sub string ditemukan dalam string dan menampilkan indeks.
sumber
sumber
Mempertaruhkan downvote karena 2+ orang lain telah menyediakan solusi ini. Saya bahkan membatalkan salah satu dari mereka. Tapi milikku mungkin yang paling mudah dipahami oleh pemula.
sumber
Untuk string sederhana dengan batasan ruang, menggunakan Dict akan cukup cepat, silakan lihat kode seperti di bawah ini
sumber
Anda dapat menggunakan
startswith
metode ini:sumber
Logika di bawah ini akan berfungsi untuk semua karakter string & khusus
sumber
Inilah solusi dalam Python 3 dan case-sensitive:
sumber
sumber
sumber
sumber
Ini membuat daftar semua kemunculan (juga tumpang tindih) dalam string dan menghitungnya
Contoh:
akan membuat daftar ini tetapi hanya menyimpan nilai BOLD :
[ab, bc , ca, ab, bc , cd]
itu akan kembali:
sumber
Inilah solusi yang berfungsi untuk kejadian yang tidak tumpang tindih dan tumpang tindih. Untuk memperjelas: substring yang tumpang tindih adalah yang karakter terakhirnya identik dengan karakter pertamanya.
sumber