किसी भी दो वर्णमाला वर्णों के बीच डैश की संख्या की गणना कैसे करें?


10

यदि हमारे पास वर्णमाला वर्णों और कुछ डैश की एक स्ट्रिंग है, और हम इस स्ट्रिंग में किसी भी दो वर्णमाला वर्णों के बीच डैश की संख्या की गणना करना चाहते हैं। ऐसा करने का सबसे आसान तरीका क्या है?

उदाहरण:

इनपुट: a--bc---d-k

उत्पादन: 2031

इसका अर्थ है कि ए और बी के बीच 2 डैश, बी और सी के बीच 0 डैश, सी और डी के बीच 3 डैश और के और के बीच 1 डैश

अजगर में इस आउटपुट सूची को खोजने का एक अच्छा तरीका क्या है?


3
आप बस इसे लूप के लिए आज़मा सकते हैं।
बोसॉन्ग चोई

1
@BoseongChoi हां, मैंने निश्चित रूप से लूप के लिए कोशिश की, लेकिन मैं उलझन में था, क्या आप कृपया अधिक समझा सकते हैं?
Not_Founded

@ Ch3steR मैंने माना कि हमारे पास ऐसा कोई इनपुट नहीं है।
Not_Founded

2
तो दोनों a-b-cऔर a-----------bएक ही आउटपुट बन जाएगा 11?
हीप ओवरफ्लो

वे हाइफ़न हैं, डैश नहीं।
TRIG

जवाबों:


9

रेगेक्स के साथ समाधान:

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
@ जेवीडीवी अच्छा बिंदु f, धन्यवाद। मैं एफ-स्ट्रिंग का उपयोग कर रहा था, लेकिन मैंने उत्तर को सुधारते हुए उस हिस्से को गिरा दिया, लेकिन मैं हटाना भूल गया f। मैंने अपना उत्तर अपडेट कर दिया। कोई ज़रूरत नहीं है कब्जा समूह भी सही :)
बोसॉन्ग चोई

1
@Tim नंबर का सामना होने countपर ही किया जाता है। यदि के साथ समाप्त होता है , तो पिछले को नजरअंदाज कर दिया जाएगा। resultsc != '-'x-count
बोसॉन्ग चोई

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 को पसंद नहीं कर सकते जो हमेशा सूची के शीर्ष पर होता है।

यदि आपको आउटपुट को स्ट्रिंग की स्ट्रिंग के रूप में चाहिए, तो आप इसे जोड़ सकते हैं:

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)
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.