2016-03-07 44 views
1

您好我正在學習使用Python進行編程來操作數據庫,我不能完成這個簡單的任務。請有人幫助我。 我有這個名單使用條件刪除列表中的元素

CIS=['4998200lp','2159140lp','02546or'] 

我想要得到這樣的結果:

CIS=['4998200lp','2159140lp','2546or'] 

我嘗試類似:

for x in CIS: 
    izq= x[:1] 
    if izq == 0: 
     CIS=[x.replace(x[:1],'') for x in CIS] 
    print (CIS) 

我只是想刪除每個字符串的第一個元素條件爲izq == 0

+3

所以你只想剝去前導的'0'字符?如果該物品是「002546或」,該怎麼辦? – mgilson

+1

此外,你正在用'0'作爲整數來評估'izq == 0'。將其更改爲'izq =='0''將有所幫助。儘管替換它的方式也是低效的。 –

回答

1

您描述與您的示例輸入/輸出不符,這與您的代碼不同。

基於示例輸入/輸出,我懷疑你要做的是從任何以0開頭的字符串中剝離單個前導0。這還不算太壞,但是你不能在for循環中做到這一點,而沒有要返回的索引。對於這一點,你可以使用enumerate

for i, x in enumerate(CIS): 
    if x.startswith('0'): # or x[:1] == '0' if you really prefer 
     CIS[i] = x[1:] 

或者,你可以使用列表理解來代替CIS

CIS = [x[1:] if x.startswith('0') else x for x in CIS] 

,並在適當位置變異(而不是製造新的list),使用相同的理解,但分配給全片,這使得其行爲如同第一個例子中的拼寫循環:

CIS[:] = [x[1:] if x.startswith('0') else x for x in CIS] 

該差異如果CIS作爲參數傳遞給函數,或者在多個地方被引用,則發生示例#1 /#3和示例#2之間的區別。在#1 /#3中,它正在變異list,因此所有引用都會看到更新,在#2中,將重新指定CIS,但保留原始list不變;如果存在其他參考,則它們不會顯示更改。

注意:如果目標是消除所有領先0 S,然後用str.lstrip,例如:

CIS = [x.lstrip('0') for x in CIS] 

與其它方法類似調整。在這種情況下,您甚至不需要測試0的存在情況,因爲如果lstrip未以0開頭,它將返回未修改的str

+0

對於使用'itertools.starmap'和'itertools.repeat'的有趣功能版本:'list(starmap(str.lstrip,zip(CIS,repeat('0'))))'。 –

+0

而「有趣」我的意思是「比CIS [x]中的[x.lstrip('0')慢很多',所以不應該使用它。」 –

+0

@JaredGoguen:實際上,如果你使用的是Py3版本的map,你可以跳過'starmap'和'zip'(在Py2中,可以在'future_builtins'上找到),只需要:'list(map( str.lstrip,CIS,repeat('0')))'但是,在大多數情況下可能會變得更慢(如果它變得更快,那隻會用於巨大的輸入)。 – ShadowRanger

1

如果您只是想刪除每個字符串的第一個零,請使用startswith方法。另外,不要查找整數0.查找字符串'0'。

最後,可以簡化您的實現與做這一切的理解,創造你的新數據的新名單:

[w[1:] if w.startswith('0') else w for w in CIS] 

輸出:

['4998200lp', '2159140lp', '2546or'] 
0

只是嘗試刪除第一個字符以0開頭的每個元素:

CIS=['4998200lp','2159140lp','02546or'] 
for i,v in enumerate(CIS): 
    if v.startswith('0'): 
     CIS[i] = v[1:] 

CIS # ['4998200lp', '2159140lp', '2546or'] 
+2

注意:與OP的代碼(和其他答案)不同,如果'list'中的任何字符串都是空字符串,則會引發異常。可以使用'v [:1] =='0''或使用v.startswith('0')'來避免這個問題,而不需要爲空字符串引入特殊情況。 – ShadowRanger

0

其實你的循環包含了非常密切的方法來工作的解決方案:

CIS=['4998200lp','2159140lp','02546or'] 
CIS=[x.replace(x[:1],'') for x in CIS] 

但是這將去除所有第一要素。如果只更換他們,如果他們是'0'(注意,這不是一樣的integer0),你需要if ... else ...納入你進入列表理解:

CIS=['4998200lp','2159140lp','02546or'] 
CIS=[x.replace(x[:1],'',1) if x[:1] == '0' else x for x in CIS ] 

if ... else ...語法可能有點陌生,但只是嘗試大聲讀取代碼:「如果第一個字符爲零,或者如果不插入x,則對於CIS中的每個x,插入替換的x。

其他答案包含更復雜的方法,但我只是想添加這個答案給你一個單挑,你是在正確的軌道上!

但是在for循環中使用列表理解通常是一個糟糕的主意,如果它們遍歷相同的iterable。大多數情況下,你只是想要其中之一。