python - 查找与另一个列表对应的元素的索引
问题描述
我有一个字符串列表:ls = ['a','b','c']
另一个字符串更大,保证包含一个且仅包含一个来自ls
:的字符串ls2 = ['1298a', 'eebbbd', 'qcqcq321']"
。
对于来自 的给定字符串,我如何找到来自ls2
的相应字符串的索引是什么ls
?
我可以用:
for s in ls:
for ss in ls2:
if s in ss:
print (s,ss,ls.index(s))
a 1298a 0
b eebbbd 1
c qcqcq321 2
但它有更好的东西吗?
编辑(希望它澄清):
我正在处理的实际案例有一个更大的第一个列表和一个较小的第二个:
ls = ['apo','b','c','d25','egg','f','g']
ls2 = ['apoip21', 'oiujohuid25']
我想得到结果0,3
,因为第 1 项ls2
有第 1 项ls
,而第 2项ls2
有第 4项ls
解决方案
如果没有有关您的数据的更多信息,您似乎无法摆脱O(m * n * p)
复杂性(where m = len(ls)
, n = len(ls2)
, )。您绝对可以通过使用跟踪当前索引来p = max(map(len, ls2))
减少当前循环。另外,不要忘记提前终止:O(m2 * n * p)
enumerate
for string in ls2:
for index, key in enumerate(ls):
if key in string:
print(key, string, index)
break
请注意,我交换了内部和外部循环以使break
工作正常:您肯定要检查 的每个元素ls2
,但只检查ls
.
以下是我在此处介绍的不同解决方案上积累的一些时间O(m * n * p)
。感谢@thierry-lathuille 提供测试数据:
ls = ['g', 'j', 'z', 'a', 'rr', 'ttt', 'b', 'c', 'd', 'f']
ls2 = ['1298a', 'eebbb', 'qcqcq321', 'mlkjmd', 'dùmlk', 'lof',
'erreee', 'bmw', 'ottt', 'jllll', 'lla' ]
def with_table():
table = {key: index for index, key in enumerate(ls)}
result = {}
for string in ls2:
for key in ls:
if key in string:
result[string] = table[key]
return result
def with_enumerate():
result = {}
for string in ls2:
for index, key in enumerate(ls):
if key in string:
result[string] = index
break
return result
def with_dict_comp():
return {string: index for string in ls2 for index, key in enumerate(ls) if key in string}
def with_itertools():
result = {}
for (index, key), string in itertools.product(enumerate(ls), ls2):
if key in string:
result[string] = index
return result
%timeit with_table()
4.89 µs ± 61.5 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
%timeit with_enumerate()
5.27 µs ± 66.5 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
%timeit with_dict_comp()
6.9 µs ± 83.8 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
%timeit with_itertools()
17.5 ns ± 0.193 ns per loop (mean ± std. dev. of 7 runs, 100000000 loops each)
事实证明,为索引创建查找表比使用enumerate
.
推荐阅读
- flutter - HERE SDK Flutter:平滑相机 + 移除 3D 建筑
- kotlin - StateFlow 与应用程序的生命周期相关,但没有 GlobalScope(Android、协程)
- javascript - 如何防止元素的移动移动其他元素?
- javascript - 在某个点停止滚动并继续使用滚动移动来做事
- javascript - 如果状态更新,React 是否会更新依赖于组件状态的所有变量和对象?
- list - 如何通过 Map 的特定键合并/加入两个 Map 列表?
- google-analytics - 谷歌分析自定义维度混淆
- android - 当 Koin 可用时,我为什么要使用 Android Hilt (Dagger2)
- primeng - 在primeng-calendar范围选择中动态设置maxDate
- kotlin - Kotlin 中的任何字符串函数?