簡體   English   中英

如何用0替換空字符串,但如果不為空則不管它

[英]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):

  1. str.replace(..)用第二個arg替換第一個arg
  2. ""總是在一個字符串中(看我的意思'ab'.count('')返回3)

解釋(對於我的例子):

  1. 我創建了一個def(函數)
  2. 然后我做了一個字典
  3. 然后我做dict.get檢查

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM