Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/292.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 从字符串列表中删除整数_Python_Regex_String_List - Fatal编程技术网

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
of
list
of
list
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']]]