Python 查找子集位置

Python find subsets positions

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

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方式,那么有没有更好的方式?

从非常长的列表vll

中切出一个子列表,sl 长度切片 len(sl)

看看它们是否等于 if sl == vll[i:i+len(sl)]

递增 ifor i in range(len(vll)-len(sl)+1)

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

sl = ['10', '10']

[i for i in range(len(vll)-len(sl)+1) if sl == vll[i:i+len(sl)]]

Out[986]: [7, 16]

什么是最Pythonic的方式?好吧......这取决于你想要完成什么以及你想要优化什么......

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

由于您有针对您的特定挑战的工作代码,我猜您想要优化这些 "subset lookups" 的性能 - 这意味着您需要检查列表中的多个存在和位置子集(对?)。如果是这样,为了优化查找速度(以内存为代价),您可以遍历长列表一次并为所有子集及其在 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) vs. O(n));尽管字典将比您要处理的 "large list" 大得多。

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

这种方式比较快,不知道有没有比这种方式更快的方式:

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)