Python 从字符串列表中删除整数
我有一个字符串列表,我想删除其中的整数Python 从字符串列表中删除整数,python,regex,string,list,Python,Regex,String,List,我有一个字符串列表,我想删除其中的整数 [[[u'HH', u'AH0', u'L', u'OW1'], [u'HH', u'EH0', u'L', u'OW1']]] 以上列表应返回 [[[u'HH', u'AH', u'L', u'OW'], [u'HH', u'EH', u'L', u'OW']]] 我试过使用过滤器 filter(lambda i: not str.isdigit(i), phoneseqList[0]) 但这似乎不起作用如果数字总是在末尾,您可以使用: 您当前正在
[[[u'HH', u'AH0', u'L', u'OW1'], [u'HH', u'EH0', u'L', u'OW1']]]
以上列表应返回
[[[u'HH', u'AH', u'L', u'OW'], [u'HH', u'EH', u'L', u'OW']]]
我试过使用过滤器
filter(lambda i: not str.isdigit(i), phoneseqList[0])
但这似乎不起作用如果数字总是在末尾,您可以使用:
您当前正在查看第一个嵌套的
列表中的每个字符串,该列表本身是列表,因此缺少isdigit()
方法。您需要处理每个字符
phoneseqList = [[[u'HH', u'AH0', u'L', u'OW1'], [u'HH', u'EH0', u'L', u'OW1']]]
newlist = [[[''.join(element for element in item if not element.isdigit()) for item in sublist] for sublist in phoneseqList[0]]]
结果:
>>> newlist
[[[u'HH', u'AH', u'L', u'OW'], [u'HH', u'EH', u'L', u'OW']]]
由于数字位于单词的末尾,并且每个项目最多只能包含2个字符,因此可以对字符串进行切片以提取前两个字符。这将省去末尾的数字
l = [[u'HH', u'AH0', u'L', u'OW1'], [u'HH', u'EH0', u'L', u'OW1']]
newL = []
for sublist in l:
tempL = []
for item in sublist:
tempL.append(item[:2])
newL.append(tempL)
print newL
对于任意嵌套的字符串列表,这里有一个递归解决方案,它将从所有字符串中删除任何数字
def remove_digits(i):
if isinstance(i, list):
return [remove_digits(j) for j in i]
else:
return ''.join(j for j in i if not j.isdigit())
范例
>>> l = [[[u'HH', u'AH0', u'L', u'OW1'], [u'HH', u'EH0', u'L', u'OW1']]]
>>> remove_digits(l)
[[['HH', 'AH', 'L', 'OW'], ['HH', 'EH', 'L', 'OW']]]
编辑
要为每个字符串添加扩展名,可以使用相同的方法
def add_ext(i, ext):
if isinstance(i, list):
return [add_ext(j, ext) for j in i]
else:
return i + ext
所以你可以说
>>> add_ext(l, '.jpeg')
只需进一步嵌套循环:
from itertools import filterfalse # ifilterfalse on Python 2
for sublist1 in toplist:
for sublist2 in sublist1:
for i, s in enumerate(sublist2):
sublist2[i] = ''.join(let for let in s if not let.isdigit())
是的,您可以使用所有嵌套列表理解中最糟糕的一种来创建一个新的list
oflist
oflist
s并替换现有的一个,但是在这种情况下,使用显式循环在适当的位置对现有的list
进行变异更为直接/可读。如果以后需要未修改的版本,您可以始终复制。deepcopy
原始顶级列表
。这将解决您的问题:
def strip_digits(text):
return ''.join([c for c in text if not c.isdigit()])
def filter_list(outer):
return [[strip_digits(i) for i in inner] for inner in outer]
如果您喜欢TDD,请使用附带的单元测试:)
您可以使用str.translate
删除数字:
l = [[[u'HH2', u'AH0', u'L', u'OW1'], [u'HH', u'EH0', u'L', u'OW1']]]
tbl = {ord(d): u"" for d in u"0123456789"}
for sub in l:
sub[:] = [[s.translate(tbl) for s in w] for w in sub]
输出:
[[[u'HH', u'AH', u'L', u'OW'], [u'HH', u'EH', u'L', u'OW']]]
如果要将其用于任意嵌套:
l = [[[u'HH2', u'AH0', u'L', u'OW1'], [u'HH', u'EH0', u'L', u'OW1']]]
def rem_d(l, tbl):
if isinstance(l, list):
return [rem_d(ele, tbl) for ele in l]
return l.translate(tbl)
tbl = {ord(d): u"" for d in u"0123456789"}
print(list(rem_d(l, tbl)))
输出:
[[[u'HH', u'AH', u'L', u'OW'], [u'HH', u'EH', u'L', u'OW']]]
翻译将比迭代每个数字快得多:
In [13]: l = [[[u'HH2', u'AH0', u'L', u'OW1'], [u'HH', u'EH0', u'L', u'OW1']]]
In [14]: l = [l[0] for _ in range(100000)]
In [15]: timeit rem_d(l, tbl)
1 loops, best of 3: 777 ms per loop
In [16]: timeit remove_digits(l)
1 loops, best of 3: 1.83 s per loop
In [17]: remove_digits(l) == rem_d(l,tbl)
Out[17]: True
我同意@CoryKramer关于递归实现的观点(除非情况总是列表的列表)。下面的实现类似,它仅在必要时保留unicode编码
import re
lst = [[[u'HH', u'AH0', u'L', u'OW1'], [u'HH', u'EH0', u'L', u'OW1']]]
def removeDigits(lst):
for i,l in enumerate(lst):
if isinstance(l, list):
removeDigits(l)
else:
lst[i] = re.sub('[0-9]+','', l)
removeDigits(lst)
print lst
输出
你能提供你使用的真实代码吗?过滤器
本身不会告诉我们您是否未能以其他方式正确使用它;已经存在明显的问题(phoneseqList[0]
可能是错误的,因为unicode
的list
的list
仍在使用单一级别的索引)。另外,要明确的是,这是Python2还是Python3代码?字符串上的u
前缀使Py2成为可能,但它在Py2和Py3中都是合法的。请注意,这假设数字字符只出现在每个字符串的尾部,这恰好是给定示例的情况,但问题中没有指定(只提到删除整数)。您是对的,我只是修改了我的答案来解释这一点。在列表中添加内容时,同样的逻辑是否有效?现在我想给每个元素添加一个“.jpeg”字符串,但我不确定join方法在else@NeptuneGamer是的,同样的想法也适用,请参见我的编辑。如果您愿意,也可以一次完成所有操作,因此else
的大小写可以是“”。join(blah)+ext
为什么不返回re.sub(“\d+”,“”,i)
In [13]: l = [[[u'HH2', u'AH0', u'L', u'OW1'], [u'HH', u'EH0', u'L', u'OW1']]]
In [14]: l = [l[0] for _ in range(100000)]
In [15]: timeit rem_d(l, tbl)
1 loops, best of 3: 777 ms per loop
In [16]: timeit remove_digits(l)
1 loops, best of 3: 1.83 s per loop
In [17]: remove_digits(l) == rem_d(l,tbl)
Out[17]: True
import re
lst = [[[u'HH', u'AH0', u'L', u'OW1'], [u'HH', u'EH0', u'L', u'OW1']]]
def removeDigits(lst):
for i,l in enumerate(lst):
if isinstance(l, list):
removeDigits(l)
else:
lst[i] = re.sub('[0-9]+','', l)
removeDigits(lst)
print lst
[[[u'HH', u'AH', u'L', u'OW'], [u'HH', u'EH', u'L', u'OW']]]