65
Mới! Lưu câu hỏi hoặc câu trả lời và sắp xếp nội dung yêu thích của bạn. Tìm hiểu thêm.
Learn more.
Cách tốt nhất để đếm số lần xuất hiện của một chuỗi nhất định, bao gồm cả sự chồng chéo trong Python? Đây là một cách:
def function[string, str_to_search_for]:
count = 0
for x in xrange[len[string] - len[str_to_search_for] + 1]:
if string[x:x+len[str_to_search_for]] == str_to_search_for:
count += 1
return count
function['1011101111','11']
Phương pháp này trả về 5.
Có cách nào tốt hơn trong Python không?
charlesreid1
4.1013 Huy hiệu vàng29 Huy hiệu bạc 50 Huy hiệu Đồng3 gold badges29 silver badges50 bronze badges
Đã hỏi ngày 3 tháng 6 năm 2010 lúc 23:29Jun 3, 2010 at 23:29
0
Chà, điều này có thể nhanh hơn vì nó so sánh trong C:
def occurrences[string, sub]:
count = start = 0
while True:
start = string.find[sub, start] + 1
if start > 0:
count+=1
else:
return count
Đã trả lời ngày 3 tháng 6 năm 2010 lúc 23:35Jun 3, 2010 at 23:35
Jochen Ritzeljochen RitzelJochen Ritzel
102K29 Huy hiệu vàng196 Huy hiệu bạc191 Huy hiệu Đồng29 gold badges196 silver badges191 bronze badges
0
>>> import re
>>> text = '1011101111'
>>> len[re.findall['[?=11]', text]]
5
Nếu bạn không muốn tải toàn bộ danh sách các trận đấu vào bộ nhớ, điều này sẽ không bao giờ là vấn đề! Bạn có thể làm điều này nếu bạn thực sự muốn:
>>> sum[1 for _ in re.finditer['[?=11]', text]]
5
Là một hàm [
>>> sum[1 for _ in re.finditer['[?=11]', text]]
5
5 đảm bảo phần phụ không can thiệp vào regex]:>>> def occurrences[text, sub]:
return len[re.findall['[?={0}]'.format[re.escape[sub]], text]]
>>> occurrences[text, '11']
5
Đã trả lời ngày 29 tháng 7 năm 2012 lúc 2:04Jul 29, 2012 at 2:04
Jamylakjamylakjamylak
124K29 Huy hiệu vàng227 Huy hiệu bạc227 Huy hiệu Đồng29 gold badges227 silver badges227 bronze badges
0
Bạn cũng có thể thử sử dụng mô -đun Python Regex mới, hỗ trợ các trận đấu chồng chéo.
import regex as re
def count_overlapping[text, search_for]:
return len[re.findall[search_for, text, overlapped=True]]
count_overlapping['1011101111','11'] # 5
Đã trả lời ngày 25 tháng 8 năm 2016 lúc 22:50Aug 25, 2016 at 22:50
David CDavid cDavid C
6.9194 Huy hiệu vàng48 Huy hiệu bạc65 Huy hiệu Đồng4 gold badges48 silver badges65 bronze badges
>>> sum[1 for _ in re.finditer['[?=11]', text]]
5
6 của Python đếm các chuỗi con không chồng chéo: In [3]: "ababa".count["aba"]
Out[3]: 1
Dưới đây là một vài cách để đếm các chuỗi chồng chéo, tôi chắc chắn còn nhiều cách nữa :]
Xem xét biểu thức thường xuyên
Làm thế nào để tìm các trận đấu chồng chéo với RegEXP?
In [10]: re.findall["a[?=ba]", "ababa"]
Out[10]: ['a', 'a']
Tạo tất cả các chuỗi con
In [11]: data = "ababa"
In [17]: sum[1 for i in range[len[data]] if data.startswith["aba", i]]
Out[17]: 2
Đã trả lời ngày 14 tháng 1 năm 2016 lúc 8:50Jan 14, 2016 at 8:50
Dima Tisnekdima TisnekDima Tisnek
10,7K4 Huy hiệu vàng62 Huy hiệu bạc116 Huy hiệu đồng4 gold badges62 silver badges116 bronze badges
1
def count_substring[string, sub_string]:
count = 0
for pos in range[len[string]]:
if string[pos:].startswith[sub_string]:
count += 1
return count
Đây có thể là cách dễ nhất.
Graham
2.5453 Huy hiệu vàng15 Huy hiệu bạc 30 Huy hiệu Đồng3 gold badges15 silver badges30 bronze badges
Đã trả lời ngày 12 tháng 5 năm 2018 lúc 4:01May 12, 2018 at 4:01
Arun Tomarun TomArun Tom
7316 Huy hiệu bạc8 Huy hiệu Đồng6 silver badges8 bronze badges
Một cách khá pythonic sẽ là sử dụng danh sách hiểu ở đây, mặc dù nó có thể không hiệu quả nhất.
def occurrences[string, sub]:
count = start = 0
while True:
start = string.find[sub, start] + 1
if start > 0:
count+=1
else:
return count
0Danh sách sẽ là
>>> sum[1 for _ in re.finditer['[?=11]', text]]
5
7 vì nó kiểm tra tất cả các chỉ mục thông qua chuỗi và vì >>> sum[1 for _ in re.finditer['[?=11]', text]]
5
8, >>> sum[1 for _ in re.finditer['[?=11]', text]]
5
9 cung cấp cho chúng tôi tổng số trận đấu.
0x12
18.3K21 Huy hiệu vàng65 Huy hiệu bạc123 Huy hiệu Đồng21 gold badges65 silver badges123 bronze badges
Đã trả lời ngày 26 tháng 2 năm 2019 lúc 23:08Feb 26, 2019 at 23:08
ParkerdparkerdParkerD
1.06211 Huy hiệu bạc16 Huy hiệu đồng11 silver badges16 bronze badges
def occurrences[string, sub]:
count = start = 0
while True:
start = string.find[sub, start] + 1
if start > 0:
count+=1
else:
return count
1Đã trả lời ngày 7 tháng 3 năm 2015 lúc 13:49Mar 7, 2015 at 13:49
Cách tìm một mẫu trong một chuỗi khác với sự chồng chéo
Hàm này [một giải pháp khác!] Nhận một mẫu và một văn bản. Trả về một danh sách với tất cả các chuỗi con nằm trong vị trí của họ.
def occurrences[string, sub]:
count = start = 0
while True:
start = string.find[sub, start] + 1
if start > 0:
count+=1
else:
return count
2[['ana', 1], ['ana', 3]] [['Bana', 0], ['nana', 2], ['fana', 7], ['fana', 15]]
[['Bana', 0], ['nana', 2], ['fana', 7], ['fana', 15]]
Đã trả lời ngày 2 tháng 8 năm 2016 lúc 1:32Aug 2, 2016 at 1:32
Câu trả lời của tôi, cho câu hỏi Bob trong khóa học:
def occurrences[string, sub]:
count = start = 0
while True:
start = string.find[sub, start] + 1
if start > 0:
count+=1
else:
return count
3Đã trả lời ngày 22 tháng 1 năm 2015 lúc 22:30Jan 22, 2015 at 22:30
Luke Dluke dLuke D
1.9513 huy hiệu vàng15 Huy hiệu bạc16 Huy hiệu đồng3 gold badges15 silver badges16 bronze badges
0
Dưới đây là giải pháp EDX MIT "Tìm Bob"* của tôi [* Tìm số lượng "Bob" xảy ra trong một chuỗi có tên S], mà cơ bản tính các lần xuất hiện chồng chéo của một ứng cử viên đã cho:
def occurrences[string, sub]:
count = start = 0
while True:
start = string.find[sub, start] + 1
if start > 0:
count+=1
else:
return count
4Đã trả lời ngày 2 tháng 9 năm 2015 lúc 13:22Sep 2, 2015 at 13:22
Dasdachsdasdachsdasdachs
65912 Huy hiệu bạc16 Huy hiệu đồng12 silver badges16 bronze badges
Nếu chuỗi lớn, bạn muốn sử dụng Rabin-Karp, tóm lại:
- một cửa sổ cuộn có kích thước chuỗi con, di chuyển qua một chuỗi
- Một hàm băm với O [1] Chi phí để thêm và loại bỏ [tức là di chuyển bằng 1 char]
- được thực hiện trong C hoặc dựa vào pypy
Đã trả lời ngày 10 tháng 4 năm 2017 lúc 12:51Apr 10, 2017 at 12:51
Dima Tisnekdima TisnekDima Tisnek
10,7K4 Huy hiệu vàng62 Huy hiệu bạc116 Huy hiệu đồng4 gold badges62 silver badges116 bronze badges
Đây có thể là cách dễ nhất.
def occurrences[string, sub]:
count = start = 0
while True:
start = string.find[sub, start] + 1
if start > 0:
count+=1
else:
return count
5GrahamAug 4, 2017 at 6:55
def occurrences[string, sub]:
count = start = 0
while True:
start = string.find[sub, start] + 1
if start > 0:
count+=1
else:
return count
62.5453 Huy hiệu vàng15 Huy hiệu bạc 30 Huy hiệu Đồng
Đã trả lời ngày 12 tháng 5 năm 2018 lúc 4:01Sep 19, 2017 at 23:12
0
Arun Tomarun Tom
7316 Huy hiệu bạc8 Huy hiệu ĐồngMột cách khá pythonic sẽ là sử dụng danh sách hiểu ở đây, mặc dù nó có thể không hiệu quả nhất.Sep 19, 2021 at 14:00
Danh sách sẽ là
>>> sum[1 for _ in re.finditer['[?=11]', text]]
5
7 vì nó kiểm tra tất cả các chỉ mục thông qua chuỗi và vì >>> sum[1 for _ in re.finditer['[?=11]', text]]
5
8, >>> sum[1 for _ in re.finditer['[?=11]', text]]
5
9 cung cấp cho chúng tôi tổng số trận đấu.Stefan Pochmann18.3K21 Huy hiệu vàng65 Huy hiệu bạc123 Huy hiệu Đồng8 gold badges42 silver badges104 bronze badges
def occurrences[string, sub]:
count = start = 0
while True:
start = string.find[sub, start] + 1
if start > 0:
count+=1
else:
return count
8Đã trả lời ngày 26 tháng 2 năm 2019 lúc 23:08Jun 3, 2010 at 23:39
Parkerdparkerd
def occurrences[string, sub]:
count = start = 0
while True:
start = string.find[sub, start] + 1
if start > 0:
count+=1
else:
return count
91.06211 Huy hiệu bạc16 Huy hiệu đồngAug 1, 2015 at 15:16
Đã trả lời ngày 7 tháng 3 năm 2015 lúc 13:49
Cách tìm một mẫu trong một chuỗi khác với sự chồng chéo
Hàm này [một giải pháp khác!] Nhận một mẫu và một văn bản. Trả về một danh sách với tất cả các chuỗi con nằm trong vị trí của họ.Oct 3, 2015 at 17:52
[['ana', 1], ['ana', 3]] [['Bana', 0], ['nana', 2], ['fana', 7], ['fana', 15]]Andre
Đã trả lời ngày 2 tháng 8 năm 2016 lúc 1:324 gold badges28 silver badges39 bronze badges
Câu trả lời của tôi, cho câu hỏi Bob trong khóa học:
>>> import re
>>> text = '1011101111'
>>> len[re.findall['[?=11]', text]]
5
1Đã trả lời ngày 22 tháng 1 năm 2015 lúc 22:30
Luke Dluke dOct 29, 2016 at 7:45
1.9513 huy hiệu vàng15 Huy hiệu bạc16 Huy hiệu đồng
>>> import re
>>> text = '1011101111'
>>> len[re.findall['[?=11]', text]]
5
2Dưới đây là giải pháp EDX MIT "Tìm Bob"* của tôi [* Tìm số lượng "Bob" xảy ra trong một chuỗi có tên S], mà cơ bản tính các lần xuất hiện chồng chéo của một ứng cử viên đã cho:May 7, 2018 at 3:42
Đã trả lời ngày 2 tháng 9 năm 2015 lúc 13:22AChampion
Dasdachsdasdachs3 gold badges55 silver badges70 bronze badges
65912 Huy hiệu bạc16 Huy hiệu đồng
>>> import re
>>> text = '1011101111'
>>> len[re.findall['[?=11]', text]]
5
3Nếu chuỗi lớn, bạn muốn sử dụng Rabin-Karp, tóm lại:
một cửa sổ cuộn có kích thước chuỗi con, di chuyển qua một chuỗi
>>> import re
>>> text = '1011101111'
>>> len[re.findall['[?=11]', text]]
5
4Một hàm băm với O [1] Chi phí để thêm và loại bỏ [tức là di chuyển bằng 1 char]
>>> import re
>>> text = '1011101111'
>>> len[re.findall['[?=11]', text]]
5
5hoặc mở rộng cho máy phát điện:
>>> import re
>>> text = '1011101111'
>>> len[re.findall['[?=11]', text]]
5
6Thay thế
Bạn có thể sử dụng
>>> def occurrences[text, sub]:
return len[re.findall['[?={0}]'.format[re.escape[sub]], text]]
>>> occurrences[text, '11']
5
7:>>> import re
>>> text = '1011101111'
>>> len[re.findall['[?=11]', text]]
5
7Đã trả lời ngày 1 tháng 9 năm 2018 lúc 22:57Sep 1, 2018 at 22:57
Pylangpylangpylang
36,5k11 Huy hiệu vàng121 Huy hiệu bạc111 Huy hiệu đồng11 gold badges121 silver badges111 bronze badges
Một cách đơn giản để đếm sự xuất hiện của chuỗi con là sử dụng
>>> def occurrences[text, sub]:
return len[re.findall['[?={0}]'.format[re.escape[sub]], text]]
>>> occurrences[text, '11']
5
8:>>> import re
>>> text = '1011101111'
>>> len[re.findall['[?=11]', text]]
5
8Bạn có thể sử dụng
>>> def occurrences[text, sub]:
return len[re.findall['[?={0}]'.format[re.escape[sub]], text]]
>>> occurrences[text, '11']
5
9 để tìm các chuỗi chồng chéo nếu bạn biết phần nào sẽ chồng chéo:>>> import re
>>> text = '1011101111'
>>> len[re.findall['[?=11]', text]]
5
9Lưu ý rằng ngoài việc tĩnh, còn có những hạn chế khác:
>>> sum[1 for _ in re.finditer['[?=11]', text]]
5
0Đã trả lời ngày 30 tháng 6 năm 2019 lúc 11:25Jun 30, 2019 at 11:25
Danbrosdanbrosdanbros
1511 Huy hiệu bạc3 Huy hiệu đồng1 silver badge3 bronze badges
>>> sum[1 for _ in re.finditer['[?=11]', text]]
5
1
Đã trả lời ngày 21 tháng 9 năm 2019 lúc 15:05Sep 21, 2019 at 15:05
Tôi muốn xem số lượng đầu vào của cùng một tiền tố char là cùng một postfix, ví dụ:
import regex as re
def count_overlapping[text, search_for]:
return len[re.findall[search_for, text, overlapped=True]]
count_overlapping['1011101111','11'] # 5
0 và import regex as re
def count_overlapping[text, search_for]:
return len[re.findall[search_for, text, overlapped=True]]
count_overlapping['1011101111','11'] # 5
1 nhưng không thành công trên import regex as re
def count_overlapping[text, search_for]:
return len[re.findall[search_for, text, overlapped=True]]
count_overlapping['1011101111','11'] # 5
2:>>> sum[1 for _ in re.finditer['[?=11]', text]]
5
2Đã trả lời ngày 7 tháng 1 lúc 20:22Jan 7 at 20:22
Một ta tA T
12.3k18 Huy hiệu vàng91 Huy hiệu bạc153 Huy hiệu đồng18 gold badges91 silver badges153 bronze badges
Giải pháp với các phần được thay thế của chuỗi
>>> sum[1 for _ in re.finditer['[?=11]', text]]
5
3Trả lời là 4.
Đã trả lời ngày 2 tháng 7 lúc 20:07Jul 2 at 20:07
Nếu bạn muốn đếm số lượng hoán vị có độ dài 5 [điều chỉnh nếu muốn cho các độ dài khác nhau]:
>>> sum[1 for _ in re.finditer['[?=11]', text]]
5
4
Himanshu
30.8k30 Huy hiệu vàng107 Huy hiệu bạc129 Huy hiệu đồng30 gold badges107 silver badges129 bronze badges
Đã trả lời ngày 20 tháng 9 năm 2012 lúc 8:19Sep 20, 2012 at 8:19
1