我有一个字符串列表,可能包含字母,符号,数字等,如下所示:
list = ['\n', '', '0', '38059', '', '', '?_', '71229366', '', '1', '38059', '', '', '?_', '87640804', '', '2', '38059', '', '', '?_', '71758011', '', '', ':?', ';__', '71229366287640804271758011287169822']
如何过滤掉除小于10000000且大于99999999的数字以外的所有其他字符串?
预期产出:
list = ['71229366', '87640804', '71758011']
答案 0 :(得分:3)
如果你不介意制作一个新的列表,你可以尝试一些只有列表理解的东西,比如
filtered_list = [i for i in list if i.isdigit() and 10000000 < int(i) < 99999999]
答案 1 :(得分:3)
您可以使用map
和filter
。
your_list = ['\n', '', '0', '38059', '', '', '?_', '71229366', '', '1', '38059',
'', '', '?_', '87640804', '', '2', '38059', '', '', '?_', '71758011',
'', '', ':?', ';__', '71229366287640804271758011287169822']
new_list = list(map(int, filter(lambda x: x.isdigit() and 10000000 < int(x) < 99999999, your_list)))
print(new_list)
python2上的 list()
可选。
输出:
[71229366, 87640804, 71758011]
如果您不希望转换为整数,请删除map
:
>>> list(filter(lambda x: x.isdigit() and 10000000 < int(x) < 99999999, your_list))
['71229366', '87640804', '71758011']
答案 2 :(得分:1)
def valid(v):
try:
value = int(v)
return 10000000 <= value <= 99999999
except:
return False
output = [x for x in list if valid(x)]
<强>解释强>:
使用有效函数作为条件筛选列表中的所有值。
答案 3 :(得分:1)
data = ['\n', '', '0', '38059', '', '', '?_', '71229366', '', '1', '38059',
'', '', '?_', '87640804', '', '2', '38059', '', '', '?_', '71758011',
'', '', ':?', ';__', '71229366287640804271758011287169822']
res = []
for e in data:
try:
number = int(e)
except ValueError:
continue
if 10000000 < number < 99999999:
res.append(str(number))
打印(RES)
print(res)
输出:
['71229366', '87640804', '71758011']
答案 4 :(得分:0)
让我使用正则表达式提供简单高效的答案。不需要map
(复制原始列表),也不需要将所有内容转换为int
s;你基本上都在询问列表中如何保留所有8位整数:
>>> filter(re.compile('^\d{8}$').match, data)
['71229366', '87640804', '71758011']
我们Here正则表达式,它恰好与8位数字匹配,然后通过向标准compile
函数提供regex.match
的部分应用来过滤列表。