Hướng dẫn how do you find the count of the repeated letters in the string python? - làm thế nào để bạn tìm thấy số lượng các ký tự lặp lại trong chuỗi python?
Grand Performance ComparisonScroll to the end for a TL;DR graph Show
Since I had "nothing better to do" (understand: I had just a lot of work), I decided to do a little performance contest. I assembled the most sensible or interesting answers and did some simple 8 in CPython 3.5.1 on them. I tested them with only one string, which is a typical input in my case:
Be aware that results might vary for different inputs, be it different length of the string or different number of distinct characters, or different average number of occurrences per character. Don't reinvent the wheelPython has made it simple for us. The 9 class does exactly what we want and a lot more. Its usage is by far the simplest of all the methods mentioned here.taken from @oefe, nice find
0 goes the extra mile, which is why it takes so
long.¿Dictionary, comprende?Let's try using a simple 1 instead. First, let's do it declaratively, using dict comprehension.I came up with this myself...
This will go through 2 from beginning to end, and for each character it will count the number of its occurrences in 2. Since 2 contains duplicate characters, the above method searches 2 several times for the same character. The result is naturally always the same. So
let's count the number of occurrences just once for each character.I came up with this myself, and so did @IrshadBhat
Better. But we still have to search through the string to count the occurrences. One search for each distinct character. That means we're going to read the string more than once. We can do better than that! But for that, we have to get off our declarativist high horse and descend into an imperative mindset. Exceptional codeAKA Gotta catch 'em all! inspired by @anthony
Well, it was worth a try. If you dig into the Python source (I can't say with certainty because I have never really done that), you will probably find that when you do 6, Python has to check whether the exception raised is actually of 7 or some other type. Just for the heck of it, let's see how long will it take if we omit that check and catch all exceptions.made by @anthony
It does save some time, so one might be tempted to use this as some sort of optimization. INTERLUDE 1
You see? It catches 8, besides other things. In fact, it catches all the exceptions there are. Including ones you might not have even heard about, like 9.INTERLUDE 2
Now back to counting letters and numbers and other characters. Playing catch-upExceptions aren't the way to go. You have to try hard to catch up with them, and when you finally do, they just throw up on you and then raise their eyebrows like it's your fault. Luckily brave fellows have paved our way so we can do away with exceptions, at least in this little exercise. The 1 class has a nice method – 1 – which allows us to retrieve an item from a dictionary,
just like 2. Except when the key 3 is not in the dictionary, it can return a default value. Let's use that method instead of fiddling with exceptions.credit goes to @Usman
Almost as fast as the set-based dict comprehension. On larger inputs, this one would probably be even faster. Use the right tool for the jobFor at least mildly knowledgeable Python programmer, the first thing that comes to mind is probably 4. It
does pretty much the same thing as the version above, except instead of a value, you give it a value factory. That might cause some overhead, because the value has to be "constructed" for each missing key individually. Let's see how it performs.hope @AlexMartelli won't crucify me for 5
Not that bad. I'd say the increase in execution time is a small tax to pay for the improved readability. However, we also favor performance, and we will not stop here. Let's take it further and prepopulate the dictionary with zeros. Then we won't have to check every time if the item is already there. hats off to @sqram 0That's good. Over three times as fast as 0, yet still simple enough. Personally, this is my favorite in case you don't want to add new characters later. And even if you do, you can still do it. It's just less convenient than it would be in other versions: 1Practicality beats purity (except when it's not really practical)Now a bit different kind of counter. @IdanK has come up with something interesting. Instead of using a hash table (a.k.a. dictionary a.k.a. 1), we can avoid the risk of hash collisions and consequent overhead of their resolution. We can also avoid the overhead of hashing the key, and the extra unoccupied table space. We can use a 8. The ASCII values of characters will be indices and their counts
will be values. As @IdanK has pointed out, this list gives us constant time access to a character's count. All we have to do is convert each character from 9 to 0 using the built-in function 1. That will give us an index into the list, which we will then use to increment the count of the character. So what we do is this: we initialize the list with zeros, do the job, and then convert the list into a 1. This 1 will only contain those characters which have
non-zero counts, in order to make it compliant with other versions.Như một lưu ý phụ, kỹ thuật này được sử dụng trong thuật toán sắp xếp thời gian tuyến tính được gọi là sắp xếp đếm hoặc sắp xếp đếm. Nó rất hiệu quả, nhưng phạm vi của các giá trị được sắp xếp bị hạn chế, vì mỗi giá trị phải có bộ đếm riêng. Để sắp xếp một chuỗi các số nguyên 32 bit, sẽ cần 4,3 tỷ quầy.count sort or counting sort. It's very efficient, but the range of values being sorted is limited, since each value has to have its own counter. To sort a sequence of 32-bit integers, 4.3 billion counters would be needed. 2Ouch! Không mát mẻ! Hãy thử và xem mất bao lâu khi chúng ta bỏ qua việc xây dựng từ điển. 3Vẫn tệ. Nhưng chờ đã, 4 là gì? Chúng ta không thể viết nó đơn giản hơn? Làm thế nào về 5? Đó là sạch hơn. Nhưng nó sẽ hoạt động tốt hơn? 4Đáng chú ý. Bây giờ chúng ta hãy đặt từ điển trở lại. 5Chậm hơn gần sáu lần. Tại sao phải mất quá lâu? Bởi vì khi chúng tôi 6, chúng tôi phải kiểm tra mỗi một trong số 256 tính và xem nó có bằng không. Nhưng chúng ta đã biết số lượng nào là bằng không và cái nào không. 6Nó có thể sẽ không tốt hơn thế, ít nhất là không phải là một đầu vào nhỏ như vậy. Thêm vào đó, nó chỉ có thể sử dụng cho các ký tự EASCII 8 bit. О о Và người chiến thắng là... 7Chuẩn rồi. Ngay cả khi bạn phải kiểm tra mỗi lần liệu 7 có ở trong 8 hay không, đối với đầu vào này, đó là cách nhanh nhất. Không có dân số trước của 8 sẽ làm cho nó nhanh hơn (một lần nữa, cho đầu vào này). Nó dài hơn rất nhiều so với 0 hoặc 4, nhưng cũng hiệu quả hơn.Đó là tất cả mọi ngườiBài tập nhỏ này dạy chúng ta một bài học: khi tối ưu hóa, luôn luôn đo lường hiệu suất, lý tưởng với các đầu vào dự kiến của bạn. Tối ưu hóa cho trường hợp chung. Đừng cho rằng một cái gì đó thực sự hiệu quả hơn chỉ vì độ phức tạp tiệm cận của nó thấp hơn. Và cuối cùng nhưng không kém phần quan trọng, hãy tiếp tục đọc trong tâm trí. Cố gắng tìm một sự thỏa hiệp giữa "thân thiện với máy tính" và "thân thiện với con người". CẬP NHẬTTôi đã được thông báo bởi @martijnpieters về hàm 2 có sẵn trong Python 3.@MartijnPieters of the function 2 available in Python 3. 8Chức năng này được thực hiện trong C, vì vậy nó sẽ nhanh hơn, nhưng hiệu suất bổ sung này có giá. Giá không tương thích với Python 2 và thậm chí có thể là phiên bản trong tương lai, vì chúng tôi đang sử dụng một chức năng riêng tư. Từ tài liệu:
Điều đó nói rằng, nếu bạn vẫn muốn tiết kiệm 620 nano giây đó cho mỗi lần lặp: 9Cập nhật 2: Chuỗi lớnTôi nghĩ rằng có thể là một ý tưởng tốt để chạy lại các thử nghiệm trên một số đầu vào lớn hơn, vì chuỗi 16 ký tự là một đầu vào nhỏ đến mức tất cả các giải pháp có thể khá nhanh (1.000 lần lặp trong vòng dưới 30 mili giây). Tôi quyết định sử dụng các tác phẩm hoàn chỉnh của Shakespeare như một tập đoàn thử nghiệm, hóa ra là một thách thức khá (vì nó có kích thước trên 5mib). Tôi chỉ sử dụng 100.000 ký tự đầu tiên của nó và tôi phải giới hạn số lần lặp từ 1.000.000 đến 1.000. 0
1Naiïve θ (n2) Từ điển thời gian hiểu đơn giản là không hoạt động 2Thông minh θ (n) Từ điển thời gian hiểu được hoạt động tốt 3Ngoại lệ là vụng về và chậm 4Bỏ qua kiểm tra loại ngoại lệ không tiết kiệm thời gian (vì ngoại lệ chỉ được ném một vài lần) 5
6
7
8Sử dụng 9Để lại chuyển đổi cuối cùng thành 0Không quan trọng bạn xây dựng 1 2Nếu bạn chuyển đổi 3Biến thể 4
5Phán quyết cuối cùng: Sử dụng >>> timeit('{c: s.count(c) for c in set(s)}', globals=locals()) 3.1484066140001232 9 trừ khi bạn không thể hoặc không muốn :)Phụ lục: NumpyGói 9 cung cấp một phương thức 0 hoàn thành (gần như) chính xác những gì chúng ta muốn.Cách thức hoạt động của phương thức này rất khác với tất cả các phương pháp trên:
6Đối với đầu vào thử nghiệm (100.000 ký tự đầu tiên của các tác phẩm hoàn chỉnh của Shakespeare), phương pháp này thực hiện tốt hơn bất kỳ thử nghiệm nào khác ở đây. Nhưng lưu ý rằng trên một đầu vào khác, phương pháp này có thể mang lại hiệu suất tồi tệ hơn các phương pháp khác. Độ sắp xếp trước của đầu vào và số lần lặp lại trên mỗi yếu tố là các yếu tố quan trọng ảnh hưởng đến hiệu suất. 7
9, hãy xem xét điều này:
Điều đó được xem xét, có vẻ hợp lý khi sử dụng 0 trừ khi bạn cần phải thực sự nhanh chóng. Và trong trường hợp đó, bạn nên biết những gì bạn đang làm nếu không bạn sẽ chậm hơn với 9 hơn là không có nó.Phụ lục 2: Một cốt truyện có phần hữu íchTôi đã chạy 13 phương pháp khác nhau ở trên trên các tiền tố của các tác phẩm hoàn chỉnh của Shakespeare và tạo ra một cốt truyện tương tác. Lưu ý rằng trong sơ đồ, cả tiền tố và thời lượng được hiển thị theo thang đo logarit (các tiền tố được sử dụng có độ dài tăng theo cấp số nhân). Nhấp vào các mục trong truyền thuyết để hiển thị/ẩn chúng trong cốt truyện. Bấm để mở! Làm thế nào để bạn đếm số lượng chữ cái lặp lại trong một chuỗi trong Python?Python.. chuỗi = "Trách nhiệm lớn" ;. in ("ký tự trùng lặp trong một chuỗi đã cho:") ;. #Count mỗi ký tự có trong chuỗi .. cho i trong phạm vi (0, len (chuỗi)):. Đếm = 1 ;. cho J trong phạm vi (i+1, len (chuỗi)):. if (chuỗi [i] == chuỗi [j] và chuỗi [i]! = ''):. Đếm = đếm + 1 ;. Làm cách nào để đếm số lượng ký tự lặp lại trong một chuỗi?Approach:.. Tìm sự xuất hiện của ký tự 'A' trong chuỗi đã cho .. Tìm số lần lặp lại được yêu cầu để tìm 'A' xảy ra .. Nhân các chuỗi xuất hiện đơn với số .... Nếu N cho n không phải là bội số của kích thước chuỗi đã cho thì chúng ta sẽ tìm thấy 'A' xảy ra trong phần phụ còn lại .. Làm thế nào để bạn đếm cùng một chữ cái trong Python?Python String Count () Phương thức đếm () trả về số lần xuất hiện của một chuỗi con trong chuỗi đã cho.
The count() method returns the number of occurrences of a substring in the given string. |