如何从不是 int 的列表列表中删除值?
How do I prune the values from a list of lists that are not int?
我试过以下功能。它应该得到一个列表列表,检查它的每个子列表是否包含一个 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'], []]
如果您想使用 列表列表 ,您可以简单地使用嵌套 列表理解 :
[[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
s:它包含str
ings 代表 个数字。在这种情况下,您应该使用 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 comprehension 和 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 expression as:
>>> [[vv for vv in v if vv.isdigit()] for v in adsVal.values()]
[['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'], []]
你可以做到
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'], []]
我试过以下功能。它应该得到一个列表列表,检查它的每个子列表是否包含一个 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'], []]
如果您想使用 列表列表 ,您可以简单地使用嵌套 列表理解 :
[[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
s:它包含str
ings 代表 个数字。在这种情况下,您应该使用 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 comprehension 和 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 expression as:
>>> [[vv for vv in v if vv.isdigit()] for v in adsVal.values()]
[['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'], []]
你可以做到
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'], []]