'L134e2t1C1o1d1e1'
原始字串是“LeetCode”
但我需要將字串與數字分開,數字不僅可以是一位數,還可以是 3-4 位數字,如 345。
我的代碼需要分成鍵值的字典;鍵是字符,數字是字符后面的數字。還要創建 2 個單獨的數字串列,僅限字母。
預期輸出:
letters = ['L', 'e', 't', 'C', 'o', 'd', 'e']
digits = [134,2,1,1,1,1,1]
此代碼未正確處理此問題。
def f(s):
d = dict()
letters = list()
# letters = list(filter(lambda x: not x.isdigit(), s))
i = 0
while i < len(s):
print('----------------------')
if not s[i].isdigit():
letters.append(s[i])
else:
j = i
temp = ''
while j < len(s) and s[j].isdigit():
j = 1
substr = s[i:j]
print(substr)
i = 1
print('----END -')
print(letters)
uj5u.com熱心網友回復:
通過以下修改,您的函式將字母與數字分開s:
def f(s):
letters = list()
digits = list()
i = 0
while i < len(s):
if not s[i].isdigit():
letters.append(s[i])
i = 1
else:
j = i
temp = ''
while j < len(s) and s[j].isdigit():
j = 1
substr = s[i:j]
i = j
digits.append(substr)
print(letters)
print(digits)
f('L134e2t1C1o1d1e1')
正如我在評論中所說,在內回圈終止后您沒有更新i,這使得i回傳到先前且已處理的索引。
uj5u.com熱心網友回復:
如果我被限制不使用正??則運算式,我會按照以下方式進行
text = 'L134e2t1C1o1d1e1'
letters = [i for i in text if i.isalpha()]
digits = ''.join(i if i.isdigit() else ' ' for i in text).split()
print(letters)
print(digits)
輸出
['L', 'e', 't', 'C', 'o', 'd', 'e']
['134', '2', '1', '1', '1', '1', '1']
說明:對于字母,我使用帶條件的簡單串列理解,.isalpha()是 str 方法,它檢查字串(在此由一個字符組成)是否為字母。對于數字(應該稱為數字),我使用單個空格替換非數字,''.join然后使用將其轉換為字串.split()(它確實拆分一個或多個空格)。請注意,digits現在list是strs 而不是ints,如果需要添加以下行:
digits = list(map(int,digits))
uj5u.com熱心網友回復:
你的字串只有兩個e's,所以我又添加了一個來完成這個例子。這是您可以做到的一種方法:
import re
t = 'L1e34e2t1C1o1d1e1'
print(re.sub('[^a-zA-Z]', '', t))
結果:
LeetCode
我知道您不能使用正則運算式,但要完成此答案,我將添加一個解決方案:
def f(s):
d = re.findall('[0-9] ', s)
l = re.findall('[a-zA-Z]', s)
print(d)
print(l)
f(t)
結果:
['134', '2', '1', '1', '1', '1', '1']
['L', 'e', 't', 'C', 'o', 'd', 'e']
uj5u.com熱心網友回復:
你編輯了你的問題,我有點困惑,所以這里有一個非常詳盡的代碼,給你一個字母串列,數字串列,帶有與數字相關的數字的字典,最后是帶有相應字符數的句子。 ..
def f(s):
letters = [c for c in s if c.isalpha()]
numbers = [c for c in s if c.isdigit()]
mydict = {}
currentKey = ""
for c in s:
print(c)
if c.isalpha():
mydict[c] = [] if c not in mydict.keys() else mydict[c]
currentKey = c
elif c.isdigit():
mydict[currentKey].append(c)
sentence = ""
for i in range(len(letters)):
count = int(numbers[i])
while count > 0:
sentence = letters[i]
count -= 1
print(letters)
print(numbers)
print(mydict)
print(sentence)
uj5u.com熱心網友回復:
letters = []
digits = []
dig = ""
for letter in 'L134e2t1C1o1d1e1':
if letter.isalpha():
# do not add empty string to list
if dig:
# append dig to list of digits
digits.append(dig)
dig = ""
letters.append(letter)
# if it is a actual letter continue
continue
# add digits to `dig`
dig = dig letter
嘗試這個。這個想法是跳過所有實際字母并將數字添加到dig.
uj5u.com熱心網友回復:
我知道有一個公認的答案,但無論如何我都會拋出這個:
letters = []
digits = []
lc = 'L134e2t1C1o1d1e1'
n = None
for c in lc:
if c.isalpha():
if n is not None:
digits.append(n)
n = None
letters.append(c)
else:
if n is None:
n = int(c)
else:
n *= 10
n = int(c)
if n is not None:
digits.append(n)
for k, v in zip(letters, digits):
dct.setdefault(k, []).append(v)
print(letters)
print(digits)
print(dct)
輸出:
['L', 'e', 't', 'C', 'o', 'd', 'e']
[134, 2, 1, 1, 1, 1, 1]
{'L': [134], 'e': [2, 1], 't': [1], 'C': [1], 'o': [1], 'd': [1]}
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/454245.html
