从字符串列表中删除整数

时间:2015-12-29 15:21:51

标签: 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])

但这似乎不起作用

8 个答案:

答案 0 :(得分:5)

对于任意嵌套的字符串列表,这里是一个递归解决方案,将删除所有字符串中的任何数字

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')

答案 1 :(得分:2)

您可以使用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

答案 2 :(得分:1)

看到数字位于单词的末尾,并且您想要的每个项目最多为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

答案 3 :(得分:1)

我同意@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

输出

[[[u'HH', u'AH', u'L', u'OW'], [u'HH', u'EH', u'L', u'OW']]]

答案 4 :(得分:0)

如果数字始终在最后,您可以使用str.rstrip

>>> phone_seq_list = [['HH', 'AH0', 'L', 'OW1'], ['HH', 'EH0', 'L', 'OW1']]
>>> [[s.rstrip('0123456789') for s in l] for l in phone_seq_list]
[['HH', 'AH', 'L', 'OW'], ['HH', 'EH', 'L', 'OW']]

答案 5 :(得分:0)

您目前正在查看第一个嵌套list中的每个字符串,该字符串本身是list,因此缺少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']]]

答案 6 :(得分:0)

进一步嵌套循环:

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 list listlist并替换现有的copy.deepcopy,但在这种情况下,它& #39;使用显式循环来改变现有的list更加直接/可读。如果您以后需要修改版本,则可以始终 .service_title { border: 1px solid black; padding: 8px; width: 20%; margin: 15px 0 0 0;/* update the margin */ } 原始顶级if( shapes[i].x<0 || shapes[i].x>width) dx=-dx; if( shapes[i].y<0 || shapes[i].y>height) dy=-dy;

答案 7 :(得分:0)

这可以解决您的问题:

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的方式进行单元测试:)

class FilterListTest(unittest.TestCase):

    def test_filter_list(self):
        # Arrange
        actual = [[u'HH', u'AH0', u'L', u'OW1'], [u'HH', u'EH0', u'L', u'OW1']]
        expected = [[u'HH', u'AH', u'L', u'OW'], [u'HH', u'EH', u'L', u'OW']]

        # Act & Assert
        self.assertEquals(filter_list(actual), expected)