我正在嘗試遍歷 nums 的每個索引并過濾所述索引中的任何 exceptioned_words 實體。這個程式的輸出似乎幾乎沒有修改,如果有的話。我該如何解決?
nums = ['-634-2385 BI', '-638-9255 Br', '.789-2936 Br', '785-2141 Br', '785-7424 Br', '634-8122 Bri', '783-2642 Br', '783-2012 !', '634-2060 Br']
excepted_chars = ['ABCDEFGHIJKLMNOPQRSTUVWXYZabdefghijklmnopqrstuvwxyz-_!?']
for i in nums.copy():
for e in i:
if any(char in excepted_chars for char in e):
nums[nums.index(i)] = nums[nums.index(i)].replace(e, '')
輸出:
['-634-2385 BI', '-638-9255 Br', '.789-2936 Br', '785-2141 Br', '785-7424 Br', '634-8122 Bri', '783-2642 Br', '783-2012 !', '634-2060 Br',]
uj5u.com熱心網友回復:
問題是這excepted_chars是一個串列,所以in excepted_chars期望它恰好是'ABCDEFGHIJKLMNOPQRSTUVWXYZabdefghijklmnopqrstuvwxyz-_!?'. 使它成為一個字串:
excepted_chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabdefghijklmnopqrstuvwxyz-_!?'
此外,如果您想洗掉非數值,請使用.isdigit串列理解或map函式:
nums = list(map(lambda x: ''.join(c for c in x if c.isdigit()), nums))
或者
nums = [''.join(c for c in i if c.isdigit()) for i in nums]
uj5u.com熱心網友回復:
nums使用串列理解更容易重建。還要注意額外的間接級別,excepted_chars因為它是單個字串的串列:
>>> nums = ['-634-2385 BI', '-638-9255 Br', '.789-2936 Br', '785-2141 Br', '785-7424 Br', '634-8122 Bri', '783-2642 Br', '783-2012 !', '634-2060 Br']
>>> excepted_chars = ['ABCDEFGHIJKLMNOPQRSTUVWXYZabdefghijklmnopqrstuvwxyz-_!?']
>>> nums = [''.join(char for char in i if char not in excepted_chars[0]) for i in nums]
>>> nums
['6342385 ', '6389255 ', '.7892936 ', '7852141 ', '7857424 ', '6348122 ', '7832642 ', '7832012 ', '6342060 ']
uj5u.com熱心網友回復:
您可以通過將例外字符字串轉換為集合來提高性能(盡管不是問題的一部分)。然后,您可以像這樣實作您的目標:
nums = ['-634-2385 BI', '-638-9255 Br', '.789-2936 Br', '785-2141 Br',
'785-7424 Br', '634-8122 Bri', '783-2642 Br', '783-2012 !', '634-2060 Br']
excepted_chars = set('ABCDEFGHIJKLMNOPQRSTUVWXYZabdefghijklmnopqrstuvwxyz-_!?')
newnums = []
for n in nums:
w = [c for c in n if c not in excepted_chars]
newnums.append(''.join(w))
print(newnums)
當然,newnums可以用更復雜的串列理解來構建,但我已經把它分解為,希望使它更容易理解
uj5u.com熱心網友回復:
您可以使用正則運算式來提取數字
nums = ['-634-2385 BI', '-638-9255 Br', '.789-2936 Br', '785-2141 Br', '785-7424 Br', '634-8122 Bri', '783-2642 Br', '783-2012 !', '634-2060 Br']
for i,num in enumerate(nums):
print(num)
nums[i] = "".join(re.findall(r'[0-9.] ',num))
uj5u.com熱心網友回復:
您可以使用 translate 從字串中洗掉字串列。要“就地”更新串列,您可以使用推導式/迭代器分配其完整的下標范圍:
nums = ['-634-2385 BI', '-638-9255 Br', '.789-2936 Br', '785-2141 Br',
'785-7424 Br', '634-8122 Bri', '783-2642 Br', '783-2012 !',
'634-2060 Br']
excepted_chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabdefghijklmnopqrstuvwxyz-_!?'
cleanUp = str.maketrans('','', excepted_chars) # 3rd parameter deletes
nums[:] = (s.translate(cleanUp) for s in nums) # assign back "in-place"
print(nums)
['6342385 ', '6389255 ', '.7892936 ', '7852141 ', '7857424 ', '6348122 ',
'7832642 ', '7832012 ', '6342060 ']
“就地”賦值僅在您有其他變數參考同一串列時才有用。如果沒有,您應該使用串列推導簡單地分配新內容:
nums = [s.translate(cleanUp) for s in nums]
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/377226.html
上一篇:回圈變數定義R
下一篇:如何獲取視窗中標簽的句柄
