Python查找子集位置

时间:2018-01-16 03:23:58

标签: python python-3.x list subset indices

我有一个非常大的列表,想要检查子集位置,我试试这个:

l = ['7', '10', '8', '8', '6', '13', '7', '10', '13', '13', 
'7', '11', '9', '7', '15', '9', '10', '13', '6', '16']

print(set(['10', '13']).issubset(set(l)))

k= []
for i in range(0, len(l) - 1):
    if l[i] == '10' and l[i + 1] == '13':
        k.append(i)

print(k) 

#True
#[7, 16]

如果列表非常大,我不认为这是一种Python方式,那么还有更好的方法吗?

3 个答案:

答案 0 :(得分:2)

从非常长的列表beforeEach((done) => { console.log(Todo); // put a breakpoint here if you want to inspect the variable Todo.remove().then(() => done()); }); 中删除子列表sl长度切片len(sl)

并查看它们是否等于vll

增加if sl == vll[i:i+len(sl)]i

for i in range(len(vll)-len(sl)+1)

答案 1 :(得分:1)

最恐怖的方式是什么?嗯......这取决于你想要完成什么以及你想要优化什么......

如果您的用例只需要在单次运行代码中检查单个子集的存在和位置......您所拥有的代码就足够了。根据“大型列表”的数据源,生成器可以帮助您提高内存效率,但我不认为这就是您所追求的目标。

由于您有针对特定挑战的工作代码,我猜您想要优化这些“子集查找”的性能 - 这意味着您需要检查列表中是否有多个子集的存在和位置(对?)。如果是这样,为了优化查找速度(以内存为代价),您可以遍历长列表一次,并在Python字典中构建所有子集及其位置的索引,如下所示:

from collections import defaultdict

large_list = ['7', '10', '8', '8', '6', '13', '7', '10', '10', '13', '7', '11',
              '9', '7', '15', '9', '10', '10', '6', '16']

indexed_subsets = defaultdict(list)

for i in range(len(large_list)-1):
    subset = (large_list[i], large_list[i+1])
    indexed_subsets[subset].append(i)


# Test if subset exists
print(('10', '10') in indexed_subsets)

# Print locations where the subset exists
print(indexed_subsets.get(('10', '10')))

# Output:
# True
# [7, 16]

此方法的好处是,检查子集是否存在以及获取子集的位置始终为fastO(1)O(n));虽然字典会比你想要处理的已经“大的列表”大得多。

......这完全取决于你想要优化的内容。

答案 2 :(得分:0)

这种方式更快,我不知道是否有某种方式比这更快:

s_vll  = str(vll)
s_sl = str(sl).replace("[", "").replace("]", "")
nl = s_vll.split(s_sl) 
p = []
c = 0
if len(nl) > 1:
    for i in range(0, len(nl) -1):
        c += nl[i].count(",") + i * (len(sl) - 1)
        p.append(c) 
print(p)