我有两个列表
list_one = ['aaa1a', 'bbb21ba', 'ccc4ba', 'qqq55ca']
list_two = ['eee21a', 'sws21ba', 'pop4ba', 'qqq55de']
最后一个数字后面的字母代表一个区域;我已经可以使用正则表达式
找到它regex = re.compile(r"[^[0-9]+$")
reg_list = []
for i in list_one:
reg_list.append(regex.findall(i))
哪个会给出
reg_list = [u'a', u'ba', u'ba', u'ca']
我想搜索list_two以检查其任何项目是否与我的reg_list中的任何内容匹配,如果是,则将其从该列表中删除。 我最终会以
结束list_two = ['qqq55de']
因为'de'是不在list_one中的唯一位置。我目前的代码是
for i in list_one:
for j in list_two:
find_location = regex.findall(j)
if a == find_location:
list_two.pop(j)
但是我收到了错误
TypeError: expected string or buffer
有没有更好的方法来执行此操作?
答案 0 :(得分:3)
假设您已经拥有reg_list
,现在可以使用filter
:
filter(lambda x: re.findall(regex, x)[0] not in reg_list, list_two)
当它变得不可读时,我不喜欢把所有东西都包括在内。只考虑最可读(当然也是最有效)的解决方案。
答案 1 :(得分:1)
您可以将列表理解用作更简洁,更简洁的替代方案:
import re
list_one = ['aaa1a', 'bbb21ba', 'ccc4ba', 'qqq55ca']
list_two = ['eee21a', 'sws21ba', 'pop4ba', 'qqq55de']
new_list_two = [i for i in list_two if any(re.sub('[a-zA-Z]+$', '', i) == re.sub('[a-zA-Z]+$', '', b) for b in list_one)]
输出:
['qqq55de']
答案 2 :(得分:0)
迭代时无法修改列表。但是你可以创建一个新的
import re
list_one = ['aaa1a', 'bbb21ba', 'ccc4ba', 'qqq55ca']
list_two = ['eee21a', 'sws21ba', 'pop4ba', 'qqq55de']
regex = re.compile(r"[^0-9]+$")
reg_list = []
for i in list_one:
reg_list.append(regex.findall(i)[0])
list_two = [j for j in list_two if regex.findall(j)[0] not in reg_list]
print(list_two)
结果:
['qqq55de']