Làm thế nào để đếm số dấu gạch ngang giữa hai ký tự chữ cái bất kỳ?


10

Nếu chúng ta có một chuỗi các ký tự chữ cái và một số dấu gạch ngang, và chúng ta muốn đếm số lượng dấu gạch ngang giữa bất kỳ hai ký tự chữ cái nào trong chuỗi này. cách dễ nhất để làm điều này là gì?

Thí dụ:

Đầu vào: a--bc---d-k

đầu ra: 2031

Điều này có nghĩa là có 2 dấu gạch ngang giữa a và b, 0 dấu gạch ngang giữa b và c, 3 dấu gạch ngang giữa c và d và 1 dấu gạch ngang giữa d và k

một cách tốt để tìm danh sách đầu ra này trong python là gì?


3
Bạn chỉ có thể thử nó với for-loop.
Boseong Choi

1
@BoseongChoi Vâng, tôi chắc chắn đã thử vòng lặp nhưng tôi rất bối rối, bạn có thể vui lòng giải thích thêm không?
Không có

@ Ch3steR Tôi cho rằng chúng tôi không có đầu vào như vậy.
Không có

2
Vì vậy, cả hai a-b-ca-----------bsẽ trở thành cùng một đầu ra 11?
Heap tràn

Đó là những dấu gạch ngang, không phải dấu gạch ngang.
TRiG

Câu trả lời:


9

Giải pháp với regex:

import re

x = 'a--bc---d-k'

results = [
    len(m) for m in
    re.findall('(?<=[a-z])-*(?=[a-z])', x)
]
print(results)
print(''.join(str(r) for r in results))

đầu ra:

[2, 0, 3, 1]
2031

Giải pháp với logic vòng lặp vũ phu:

x = 'a--bc---d-k'

count = 0
results = []
for c in x:
    if c == '-':
        count += 1
    else:
        results.append(count)
        count = 0
results = results[1:]  # cut off first length
print(results)

đầu ra:

[2, 0, 3, 1]

Tôi giả sử fphía trước của mô hình là một lỗi đánh máy? Bạn không cần phải tạo một chuỗi thô mà không có dấu gạch chéo ngược. Ngoài ra không cần nhóm chụp =). Câu trả lời hay thông qua
JvdV

1
@JvdV Điểm tốt cho f, cảm ơn. Tôi đã sử dụng chuỗi f, nhưng tôi đã bỏ phần đó trong khi tôi đang cải thiện câu trả lời, nhưng tôi quên xóa f. Tôi cập nhật câu trả lời của tôi. Không cần nhóm chụp cũng phải :)
Boseong Choi

1
@Tim số countchỉ được thêm vào resultskhi c != '-'gặp phải. Nếu xkết thúc bằng -, cuối cùng countsẽ bị bỏ qua.
Boseong Choi

11

Bạn có thể sử dụng một giải pháp rất đơn giản như thế này:

import re

s = 'a--bc---d-k'
# Create a list of dash strings.
dashes = re.split('[a-z]', s)[1:-1]
# Measure the length of each dash string in the list and join as a string.
results = ''.join([str(len(i)) for i in dashes])

Đầu ra:

'2031'


2

Nếu bạn nhập cũng có thể bắt đầu bằng dấu gạch ngang, bạn có thể sử dụng:

def count_dashes(string):
    all_counts = []
    dash_count = 0
    for char in string:
        if char == "-":
            dash_count += 1
        else:
            all_counts.append(dash_count)
            dash_count = 0
    return all_counts

Nhưng nếu đầu vào của bạn luôn bắt đầu bằng một chữ cái, bạn có thể không thích số 0 luôn ở đầu danh sách.

Nếu bạn cần đầu ra dưới dạng một chuỗi ints, thì bạn có thể thêm điều này:

def count_dashes(string):
    all_counts = []
    dash_count = 0
    for char in string:
        if char == "-":
            dash_count += 1
        else:
            all_counts.append(dash_count)
            dash_count = 0
    return "".join([str(number) for number in all_counts])

1

Đây là một cách tiếp cận vòng lặp đơn giản:

myinput = 'a--bc---d-k'
output = []
output_count = -1
for elem in myinput:
  if elem == '-':
    output[output_count] = output[output_count]+1
  else:
    output.append(0)
    output_count += 1

print(output)
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.