我有一个字符串列表列表,我希望删除整数
[[[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])
但这似乎不起作用
答案 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
list
个list
并替换现有的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)