วิธีการนับจำนวนขีดกลางระหว่างตัวอักษรสองตัวใด ๆ


10

หากเรามีสตริงของตัวอักษรตามตัวอักษรและเครื่องหมายขีดกลางบางตัวและเราต้องการนับจำนวนเครื่องหมายขีดกลางระหว่างอักขระสองตัวใด ๆ ในสตริงนี้ วิธีที่ง่ายที่สุดในการทำเช่นนี้คืออะไร?

ตัวอย่าง:

การป้อนข้อมูล: a--bc---d-k

เอาท์พุท: 2031

ซึ่งหมายความว่ามี 2 ขีดกลางระหว่าง a และ b, 0 เส้นประระหว่าง b และ c, 3 ขีดกลางระหว่าง c และ d และ 1 เส้นประระหว่าง d และ k

เป็นวิธีที่ดีในการค้นหารายการผลลัพธ์ในหลามอะไร


3
คุณสามารถลองใช้กับ for-loop
Boseong Choi

1
@BoseongChoi ใช่ฉันพยายามลูป แต่แน่นอนฉันสับสนคุณช่วยอธิบายเพิ่มเติมหน่อยได้ไหม?
Not_Founded

@ Ch3steR ฉันคิดว่าเราไม่ได้มีการป้อนข้อมูลดังกล่าว
Not_Founded

2
ดังนั้นทั้งสองa-b-cและa-----------bจะกลายเป็นเอาท์พุทเดียวกัน11?
กองมากเกิน

สิ่งเหล่านี้เป็นเครื่องหมายยัติภังค์
TRiG

คำตอบ:


9

โซลูชันด้วย 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))

เอาท์พุท:

[2, 0, 3, 1]
2031

วิธีการแก้ปัญหาด้วยตรรกะวงกำลังดุร้าย:

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)

เอาท์พุท:

[2, 0, 3, 1]

ฉันคิดว่าfด้านหน้าของลวดลายเป็นตัวพิมพ์ผิดหรือเปล่า? คุณไม่จำเป็นต้องสร้างสตริงที่ไม่มีแบ็กสแลช ยังไม่จำเป็นต้องจับภาพกลุ่ม =) คำตอบที่ดีผ่าน
JvdV

1
@JvdV เป็นจุดที่ดีfขอบคุณ ผมใช้ F-สตริง แต่ฉันลดลงส่วนหนึ่งขณะที่ฉันกำลังปรับปรุงคำตอบ fแต่ฉันลืมลบ ฉันปรับปรุงคำตอบของฉัน ไม่จำเป็นต้องมีกลุ่มการจับกุมอีกด้วย :)
Boseong Choi

1
@Tim No. countถูกต่อท้ายresultsเมื่อc != '-'พบเท่านั้น ถ้าxปลายด้วย-สุดท้ายcountจะถูกละเว้น
Boseong Choi

11

คุณสามารถใช้วิธีง่าย ๆ เช่นนี้:

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])

เอาท์พุท:

'2031'


2

หากคุณป้อนข้อมูลอาจเริ่มต้นด้วยเส้นประคุณสามารถใช้สิ่งนี้:

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

แต่ถ้าการป้อนข้อมูลของคุณเริ่มต้นด้วยตัวอักษรคุณอาจไม่ชอบ 0 ที่มักจะอยู่ที่หัวของรายการ

หากคุณต้องการผลลัพธ์เป็นสตริงของ int คุณสามารถเพิ่มสิ่งนี้ได้:

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

นี่เป็นวิธีวนรอบอย่างง่าย:

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)
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.