簡體   English   中英

如何從非int列表列表中刪減值?

[英]How do I prune the values from a list of lists that are not int?

我已經嘗試了以下功能。 它應該獲得一個列表列表,檢查其每個子列表是否包含int值,將其轉換為int,或者如果不包含,則將其刪除。 為此,應該創建一個newX,它是一個新的子列表,除了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'], []]

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

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'], []]

如果要使用列表列表 ,則可以簡單地使用嵌套列表推導

[[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'], []]

您可以將嵌套的dict理解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': []}

編輯:根據問題中的編輯,無需理解字典 為了獲取值列表,可以將列表理解表達式用作:

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

你可以做

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

y3

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

暫無
暫無

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

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