2017-06-12 37 views
0

我試過以下功能。哪一個應該得到一個列表清單,檢查它的每個子列表是否包含一個int值,將其變成int,否則刪除它。要做到這一點,這應該創建一個newX,它將是一個新的子列表,只有ints,還有一個包含子列表的新列表。如何修剪不是int列表的列表中的值?

我已經設法從子列表中獲取值,但我無法將我的想法包括在如何將每個子列表的值重新放回到x中。由於現在我要創建一個新的子列表,我需要一個全新的列表,我對整個事情感到困惑。必須有一個更簡單的方法。

def forceInt(list): 
    newList = [] 
    for x in list: 
     newX = [] 
     for y in x: 
      try: 
       int(y) 
      except: 
       continue 
      else: 
       newX.append(int(y)) 
     newList.append(newX) 
    return newList 

print(forceInt(adsVal)) 

樣品輸入:

adsVal = [['Students', 'inactive', '3'], ['Campaign 1', 'not_delivering', '']] 

輸出示例:

[['3'], []] 
+0

這不是一個列表的列表,但列出的字典... –

+0

我的壞,讓我解決它 –

+0

但爲什麼是''Students''和「運動1」仍然是輸出的一部分? –

回答

3

您可以使用嵌套字典理解str.isdigit()過濾器:

>>> adsVal = {'Students': ['inactive', '3'], 'Campaign 1': ['not_delivering', '']} 

#       v returns `True` if the string is a digit 
>>> {k:[vv for vv in v if vv.isdigit()] for k, v in adsVal.items()}} 
{'Students': ['3'], 'Campaign 1': []} 

編輯:根據問題中的編輯,dict comprehen sion不是必需的。爲了得到值的列表,你可以使用列表理解表達爲:

>>> [[vv for vv in v if vv.isdigit()] for v in adsVal.values()] 
[['3'], []] 
+2

規格已經改變了一些,所以也許應該更新答案。儘管如此,+1的解決方案相當優雅。 –

+1

@WillemVanOnsem感謝您指出問題中的更新。我很感激! –

+0

字典表單也很有用!謝謝! –

3

在你想用列表的名單工作的情況下,你可以簡單地使用嵌套列表理解

[[v for v in vs if isinstance(v,int)] for vs in data] 

(其中data是原始列表)。這會產生:

>>> [[v for v in vs if isinstance(v,int)] for vs in data] 
[[], []] 

然而你的樣品列表並不包含任何int小號:它包含str英格斯說代表。在這種情況下,你應該使用str.isdigit()

[[v for v in vs if v.isdigit()] for vs in data] 

這會產生:

>>> [[v for v in vs if v.isdigit()] for vs in data] 
[['3'], []] 
+0

我喜歡它的一切!它太優雅了!我會拿這個。謝謝:) –

4

這是一個有點冗長,但這裏是我的看法:

adsVal = {'Students': ['inactive', '3'], 'Campaign 1': ['not_delivering', '']} 

def check(value): 
    try: 
     int(value) 
     return True 
    except ValueError: 
     return False 

res = {k: [x for x in v if check(x)] for k, v in adsVal.items()} 
print(res) # {'Students': ['3'], 'Campaign 1': []} 

現在爲您編輯如果你有一個清單你可以應用相同的邏輯:

adsVal = [['Students', 'inactive', '3'], ['Campaign 1', 'not_delivering', '']] 

def check(value): 
    try: 
     int(value) 
     return True 
    except ValueError: 
     return False 

res = [[x for x in sub if check(x)] for sub in adsVal] 
print(res) # [['3'], []] 
+0

它的工作原理!我需要一段時間才能理解它,但謝謝! :) –

+1

@MiguelAlberolaCano請參閱編輯名單清單 –

+0

我也檢查過了,謝謝! –

3

你可以做

In [1]: adsVal = [['Students', 'inactive', '3'], ['Campaign 1', 'not_delivering', '']] 
In [2]: map(lambda x: filter(str.isdigit, x), adsVal) 
Out[2]: [['3'], []] 

PY3

In [3]: list(map(lambda x: list(filter(str.isdigit, x)), adsVal)) 
Out[3]: [['3'], []] 
+0

請注意,在Python-3.x中,這將產生生成器,而不是列表。 –

+0

Updated @WillemVanOnsem – itzMEonTV

+0

我對輸入輸出的含義感到困惑:S –