我有一个非常大的列表,想要检查子集位置,我试试这个:
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方式,那么还有更好的方法吗?
答案 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]
此方法的好处是,检查子集是否存在以及获取子集的位置始终为fast(O(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)