2017-06-13 18 views
2

我有被簡化爲這個問題的目的,以下結構的列表:刪除項目等於從做字符串和數字列表的數量

x = ["f","f","f",0,"f",0,0,0"f","f"]

其中「F 「將文件路徑表示爲字符串。我想要做的是從列表中刪除等於零的所有元素。我曾嘗試循環訪問像這樣:

for h in range(len(x)): 
    if x[g] == "0": 
     del x[g] 
    else: 
     pass 

這沒有工作從上迭代不起作用的列表中刪除,它似乎像列表推導是我要尋找的答案,但我不能似乎得到格式化了下來:

x = [h for h in range(len(x)) if h != 0] 

所以我最終想要的輸出是:

x = ["f","f","f",f","f",f"]

如何去achiev這樣嗎?

編輯:帕特里克在下面的評論中的答案正是我正在尋找並解決此問題。

+5

假設沒有''「f」'實際上'''''你可以做'[我爲我在x中如果我]' –

+1

''0「和'0'是不一樣的。 – MrPromethee

+0

是的,完全解決它,謝謝! – cd123

回答

0

可以更換所有0和 「0」:

li = ["f","f","f",0,"f",0,"0",0,"f","f"] 
[y for y in l if y not in ("0",0)] 

# results: 
['f', 'f', 'f', 'f', 'f', 'f'] 
0

試試這個:

x = [h for h in x if h != 0] 

建議的一些小位:

  1. 你不必指定else: pass
  2. 您可以直接遍歷一個列表,即代替:

    for i in range(len(x)): 
        x[i] 
    

    ,你可以簡單地使用:

    for i in x: 
        i 
    
  3. if x[g] == "0"只檢查是否x[g]等於字符串"0",不實際數量。根據您的代碼判斷,您需要改爲if x[g] == 0

0

我希望這段代碼能夠滿足您的需求。

x = [i for i in x if i] 

這意味着獲得從x值不爲0

0

你不能做這個循環前鋒的原因是因爲你,你走縮短名單,但如果你向後循環你不會有這個問題:

>>> x = ["f","f","f","0","f","0","0","0","f","f"] 
>>> for h in range(len(x)-1,-1,-1): 
...  if x[h] == "0": 
...   del x[h] 
... 
>>> x 
['f', 'f', 'f', 'f', 'f', 'f'] 
1

我想也注意到當X是你可能想,因爲使用大型數據集的迭代器列表過濾後要返回的迭代大尺寸表的情況下,可能會增加你的表演e(有關更多信息,請參閱Performance Advantages to Iterators?)。 在這種情況下可以使用內置過濾器(功能,可迭代)函數,將在Python 3.

x = ["f","f","f",0,"f",0,0,0,"f","f"] 
for ch in filter(lambda sym: sym != 0, x): 
    print(ch) 

返回迭代結果不等於0將被打印僅元素。 請參閱https://docs.python.org/3/library/functions.html#filter以獲得有關過濾器內置的更多信息。

另一種方法是使用生成器理解。這裏的註釋是,你將能夠迭代發生器一次。但是你也可以獲得一些好處,每個結果都將在飛行中進行評估和屈服,以便通過使用生成器表達式來保存內存。

只要用這個例子來使用發電機理解:

x = ["f","f","f",0,"f",0,0,0,"f","f"] 
for ch in (sym for sym in x if sym !=0): 
    print(ch) 

查看更多發生器理解的例子和優勢在這裏https://www.python.org/dev/peps/pep-0289/

而且是準確的過濾結果與真值測試。

任何對象都可以測試真值,用於if或while條件或作爲下面布爾操作的操作數。下面的值被認爲是假:

  • 任何數值類型的零,例如,0,0.0,0j的。
  • 任何空序列,例如'',(),[]。
  • 任何空映射,例如{}。
  • 用戶定義類的實例,如果該類定義了一個bool()或len()方法,則該方法返回整數零或布爾值False。

因此,表達式[sym for sym in x if sym]將從您的結果中移除所有False符號(即False,''等)。所以請準確使用True值測試(更多信息請參閱https://docs.python.org/3.6/library/stdtypes.html#truth-value-testing)。

相關問題