Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/282.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_Python 3.x - Fatal编程技术网

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中使用列表表示法从字符串中挑出字符。这是一个很好的答案,解释得很好。