cha*_*bln 9 python arrays indexing element list
列表haystack和needles
haystack = ['a', 'b', 'c', 'V', 'd', 'e', 'X', 'f', 'V', 'g', 'h']
needles = ['V', 'W', 'X', 'Y', 'Z']
Run Code Online (Sandbox Code Playgroud)
我需要让其产生的任何元素的索引列表needles中出现haystack.在这种情况下,那些指数因此是3,6和8
result = [3, 6, 8]
Run Code Online (Sandbox Code Playgroud)
我发现这个问题非常相似,并且相当优雅地解决了
result = [haystack.index(i) for i in needles]
Run Code Online (Sandbox Code Playgroud)
不幸的是,这个解决方案ValueError: 'W' is not in list在我的情况下.这是因为这里的不同之处在于元素needles可能haystack多次出现或者根本不出现.
换句话说,haystack可能不包含任何针或它可能包含许多针.
Pad*_*ham 15
haystack = ['a', 'b', 'c', 'V', 'd', 'e', 'X', 'f', 'V', 'g', 'h']
needles = ['V', 'W', 'X', 'Y', 'Z']
st = set(needles)
print([i for i, e in enumerate(haystack) if e in st])
[3, 6, 8]
Run Code Online (Sandbox Code Playgroud)
即使你使用[haystack.index(i) for i in needles if i in haystack]它也不会有效,因为你有重复的元素.
制作st = set(needles)意味着我们有一个线性解决方案,因为集合查找0(1)对于大输入来说效率要高得多.
如果您的针不在大海捞针中,除了会失败之外,索引方法还将仅返回您正在查找的元素的第一个位置,即使该元素出现多次(如'V'您的示例中所示)。你可以这样做:
result = [idx for idx, val in enumerate(haystack) if val in needles]
Run Code Online (Sandbox Code Playgroud)
enumerate 函数生成一个生成器,生成值元组 - 第一个是索引,第二个是值:
>>> print(list(enumerate(['a', 'b', 'c'])))
Run Code Online (Sandbox Code Playgroud)
只需检查每个值是否在您的 Needs 列表中,如果是,则添加索引。
| 归档时间: |
|
| 查看次数: |
6139 次 |
| 最近记录: |