Python 使用两个索引列表搜索第三个列表
假设我有两个索引列表Python 使用两个索引列表搜索第三个列表,python,python-3.x,Python,Python 3.x,假设我有两个索引列表 letters = ['a', 'c'] numbers = ['1','2','6'] 这些列表是基于交互式web界面元素生成的,是此场景的必要部分 python中计算效率最高的方法是什么?我可以使用这两个列表在下面的第三个列表中搜索项目 list3 = ['pa1','pa2','pa3','pa4','pa5','pa6', 'pb1','pb2','pb3','pb4','pb5','pb6', 'pc1','pc2','pc3
letters = ['a', 'c']
numbers = ['1','2','6']
这些列表是基于交互式web界面元素生成的,是此场景的必要部分
python中计算效率最高的方法是什么?我可以使用这两个列表在下面的第三个列表中搜索项目
list3 = ['pa1','pa2','pa3','pa4','pa5','pa6',
'pb1','pb2','pb3','pb4','pb5','pb6',
'pc1','pc2','pc3','pc4','pc5','pc6',
'pd1','pd2','pd3','pd4','pd5','pd6']
使用字母和数字列表,我想搜索列表3并返回此列表
sublist = ['pa1', 'pa2, 'pa6', 'pc1', 'pc2', 'pc6']
我可以这样做:
sublist = []
for tag in list3:
for l in letters:
for n in numbers:
if l in tag and n in tag:
sublist.append(tag)
但我想知道是否有更好的或更推荐的方法?最重要的是,不要反复浏览角色列表。相反,在操作中使用简单的;必要时使用任何
或所有
操作。在这种情况下,由于您的标记都是p[a-d][0-9]
格式,因此您可以直接检查相应的字符:
for tag in list3:
if tag[1] in "ac" and tag[2] in "126":
sublist.append(tag)
对于许多用途或一般情况,请将字符串替换为O(1)时间的集合:
letter = set('a', 'c')
number = set('1', '2', '6')
for tag in list3:
if tag[1] in letter and tag[2] in number:
sublist.append(tag)
接下来,去掉O(n^2)append
系列(每次添加到较长的列表中)。用列表替换它
sublist = [tag for tag in list3
if tag[1] in letter and tag[2] in number]
如果字母和数字可以出现在列表中的任何位置,则需要对每个字母和数字进行常规搜索:查找字符集中的重叠:
sublist = [tag for tag in list3
if any(char in letter for char in tag) and
any(char in number for char in tag)
]
或与一组:
sublist = [tag for tag in list3
if set(tag).intersection(letter) and
set(tag).intersection(number)
]
用简单的方法试试这个
letters = ['a', 'c']
numbers = ['1','2','6']
sublist = []
result = []
list3 = ['pa1','pa2','pa3','pa4','pa5','pa6',
'pb1','pb2','pb3','pb4','pb5','pb6',
'pc1','pc2','pc3','pc4','pc5','pc6',
'pd1','pd2','pd3','pd4','pd5','pd6']
for letter in letters:
sublist.extend(list(filter(lambda tag: letter in tag, list3)))
for number in numbers:
result.extend(list(filter(lambda tag: number in tag, sublist)))
print(result)
看一看,然后。Itertools产品可以快速生成组合pa1
,pa2
等。。。这些集合可用于快速测试成员资格(集合中包含的项目)。主要的更新是set
成员资格测试为O(1),只需1个周期,而list
成员资格测试为O(n),即列表中的元素数,周期。感谢您的深入了解。接下来的问题,为什么设置成员资格测试取O(1),而列表成员资格测试取O(n)?请参见SO问题:。谢谢。忘了我可以在python中使用列表表示法从字符串中挑出字符。这是一个很好的答案,解释得很好。