如何从非int的列表列表中删除值?

时间:2017-06-12 11:09:41

标签: python list python-3.x int try-except

我尝试过以下功能。应该获取列表列表,检查其每个子列表是否包含int值,将其转换为int,或者如果它没有,则删除它。要做到这一点,这应该创建一个newX,它将是一个只包含整数的新子列表,以及一个包含子列表的新列表。

我设法从子列表中获取值,但我无法理解如何将每个子列表的值放回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'], []]

4 个答案:

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

答案 1 :(得分: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'], []]

答案 2 :(得分: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': []}

修改:根据问题中的修改,不需要字典理解。要获取值列表,您可以使用 list comprehension 表达式:

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

答案 3 :(得分: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'], []]