[英]How to replace an empty string with 0, but leave it alone if not empty
在下面顯示的情況下替換值時,Python的行為似乎不一致(使用python 3.6.5)
>>> emptyString = ' '
>>> emptyString.strip().replace('','0') #produces expected results
'0'
>>> notEmptyString = ' 50 '
>>> notEmptyString.strip().replace('','0') #expected '50'
'05000'
>>> shortString = notEmptyString.strip()
>>> shortString #results as expected
'50'
>>> shortString.replace('','0') #unexpected results - expected '50'
'05000'
這是我想看到的:
- 如果string有一個值,只需strip()前導和尾隨空格。
- 如果string為空(即“”)或string只是空白字符(即“”),則將其刪除為“”並將“”替換為“0”
示例#1 ... string =“10”....然后只刪除前導和尾隨空格
示例#2 ... string =''....然后轉換為'0'
我可以通過其他方式得到我想要的結果,但我想知道是否有人理解為什么python會產生這些結果。
如果s
是一個字符串,那么:
s.replace(old, new)
返回s
的副本,每次出現的字符串old
替換為new
,例如:
In [7]: "abracadabra".replace("a","4")
Out[7]: '4br4c4d4br4'
作為特殊情況,如果old
為空字符串,則在字符串的開頭和結尾以及每對字符之間插入new
:
In [8]: "12345678".replace("","_")
Out[8]: '_1_2_3_4_5_6_7_8_'
理由是在第一個字符之前,每對字符之間以及最后一個字符之后有一個“空字符串”,這就是被替換的內容。
所以, replace
不是你在想什么。
為了做你想做的事,你可以使用已經提出的解決方案之一,或者如果你感覺聰明的話,可以使用這樣的方法:
s.strip() or "0"
這與replace
工作的方式有關。
將其視為查看字符串的每個索引,並從每個索引開始創建子字符串。 然后它檢查是否有任何子字符串以要查找的字符串開頭。 然后它記錄以要查找的字符串開頭的子字符串的索引,刪除要查找的字符串,並在這些索引處插入替換字符串。
對於''
,只有一個索引要查看,從該索引開始的子字符串是''
,以''
開頭,因此插入0。
對於50
,有3個指數可供查看。 從索引開始的子串是:
'50'
'0'
''
所有這些子串都以''
開頭,因此在所有索引中插入0,創建'05000'
。
str.replace
如何工作 您將str.replace
方法解釋為將新字符串替換為整個字符串。 不是這種情況。
它的作用是用字符串中的第二個參數替換第一個參數的每個出現 。
'ababc'.replace('ab', 'x') # 'xxc'
這里可能令人困惑的是你正在替換空字符串的每一個出現。 事實證明,空字符串隨處可見,每兩個字符之間是一個空字符串。
如果這對你沒有意義,只要考慮下面的確是True
'' + '5' + '' + '0' + '' == '50'
這樣做......
s.replace('', '0')
相當於在所有字符之間插入'0'
。 它等同於以下內容。
'0'.join(s.split())
你想要做的是剝離你的字符串,如果它是空的,使它為'0'
,這里有幾種方法可以做到這一點。
# 1)
s = emptyString.strip()
s = s if s else '0'
# 2)
s = emptyString.strip() or '0'
正如@coldspeed在評論中建議的那樣,您需要:
def myfunc(string): return string if string.strip() else '0'
print(myfunc(' 050 '))
print(myfunc(' '))
print(myfunc(''))
print(myfunc('abcd'))
輸出:
050
0
0
abcd
另一種方法:
def f(s):
return {'':'0'}.get(s.strip(),s)
print(f(' '))
print(f(' a '))
輸出:
0
a
解釋(對於str.replace):
""
總是在一個字符串中(看我的意思'ab'.count('')
返回3) 解釋(對於我的例子):
dict.get
檢查
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.