Python 如何在列表中查找元素的所有引用
将给出列表中第一个出现的项。是否有一个简洁的技巧可以返回元素列表中的所有索引?您可以使用列表理解:Python 如何在列表中查找元素的所有引用,python,list,Python,List,将给出列表中第一个出现的项。是否有一个简洁的技巧可以返回元素列表中的所有索引?您可以使用列表理解: indices = [i for i, x in enumerate(my_list) if x == "whatever"] 迭代器enumerate(my_list)为列表中的每个项生成对(索引,项)。使用i,x作为循环变量目标,将这些对解压到索引i和列表项x中。我们筛选所有符合我们标准的x,并选择这些元素的索引i。您可以使用列表: indices = [i for i,
indices = [i for i, x in enumerate(my_list) if x == "whatever"]
迭代器
enumerate(my_list)
为列表中的每个项生成对(索引,项)
。使用i,x
作为循环变量目标,将这些对解压到索引i
和列表项x
中。我们筛选所有符合我们标准的x
,并选择这些元素的索引i
。您可以使用列表:
indices = [i for i, x in enumerate(my_list) if x == "whatever"]
迭代器enumerate(my_list)
为列表中的每个项生成对(索引,项)
。使用i,x
作为循环变量目标,将这些对解压到索引i
和列表项x
中。我们筛选所有符合我们标准的x
,并选择这些元素的索引i
。如何:
In [1]: l=[1,2,3,4,3,2,5,6,7]
In [2]: [i for i,val in enumerate(l) if val==3]
Out[2]: [2, 4]
那么:
In [1]: l=[1,2,3,4,3,2,5,6,7]
In [2]: [i for i,val in enumerate(l) if val==3]
Out[2]: [2, 4]
对于所有事件,还有一个解决方案(如果重复,请抱歉):
values = [1,2,3,1,2,4,5,6,3,2,1]
map(lambda val: (val, [i for i in xrange(len(values)) if values[i] == val]), values)
对于所有事件,还有一个解决方案(如果重复,请抱歉):
values = [1,2,3,1,2,4,5,6,3,2,1]
map(lambda val: (val, [i for i in xrange(len(values)) if values[i] == val]), values)
虽然不是直接针对列表的解决方案,
numpy
在这类事情上确实非常出色:
import numpy as np
values = np.array([1,2,3,1,2,4,5,6,3,2,1])
searchval = 3
ii = np.where(values == searchval)[0]
返回:
ii ==>array([2, 8])
与其他一些解决方案相比,对于包含大量元素的列表(数组)而言,这可能要快得多。虽然不是直接针对列表的解决方案,
numpy
在这方面确实非常出色:
import numpy as np
values = np.array([1,2,3,1,2,4,5,6,3,2,1])
searchval = 3
ii = np.where(values == searchval)[0]
返回:
ii ==>array([2, 8])
对于包含大量元素的列表(数组),这比其他一些解决方案要快得多。使用
list.index的解决方案:
def indices(lst, element):
result = []
offset = -1
while True:
try:
offset = lst.index(element, offset+1)
except ValueError:
return result
result.append(offset)
对于大型列表,它比使用enumerate
理解列表快得多。如果您已经拥有阵列,那么它也比numpy
解决方案慢得多,否则转换的成本超过了速度增益(在包含100、1000和10000个元素的整数列表上测试)
注意:基于Chris_Rands的评论的注意事项:如果结果足够稀疏,但如果列表中有许多被搜索元素的实例(在使用1000个整数的测试中,超过列表的15%),则此解决方案比列表理解快,列表理解更快。使用list.index的解决方案:
def indices(lst, element):
result = []
offset = -1
while True:
try:
offset = lst.index(element, offset+1)
except ValueError:
return result
result.append(offset)
对于大型列表,它比使用enumerate
理解列表快得多。如果您已经拥有阵列,那么它也比numpy
解决方案慢得多,否则转换的成本超过了速度增益(在包含100、1000和10000个元素的整数列表上测试)
注意:基于Chris_Rands的评论的注意事项:如果结果足够稀疏,但如果列表中有许多被搜索元素的实例(在使用1000个整数的测试中,超过列表的15%),则此解决方案比列表理解快,列表理解速度更快。如果您使用的是Python 2,您可以通过以下方式实现相同的功能:
f = lambda my_list, value:filter(lambda x: my_list[x] == value, range(len(my_list)))
其中,my_list
是要获取索引的列表,value
是搜索的值。用法:
f(some_list, some_element)
如果您使用的是Python 2,则可以通过以下方式实现相同的功能:
f = lambda my_list, value:filter(lambda x: my_list[x] == value, range(len(my_list)))
其中,my_list
是要获取索引的列表,value
是搜索的值。用法:
f(some_list, some_element)
如果需要搜索某些索引之间的所有元素位置,可以声明它们:
[i for i,x in enumerate([1,2,3,2]) if x==2 & 2<= i <=3] # -> [3]
[i代表枚举([1,2,3,2])中的i,x如果x==2&2如果需要搜索某些索引之间的所有元素位置,可以声明它们:
[i for i,x in enumerate([1,2,3,2]) if x==2 & 2<= i <=3] # -> [3]
[i代表枚举([1,2,3,2])中的i,x,如果x==2&2您可以创建一个defaultdict
from collections import defaultdict
d1 = defaultdict(int) # defaults to 0 values for keys
unq = set(lst1) # lst1 = [1, 2, 2, 3, 4, 1, 2, 7]
for each in unq:
d1[each] = lst1.count(each)
else:
print(d1)
您可以创建一个defaultdict
from collections import defaultdict
d1 = defaultdict(int) # defaults to 0 values for keys
unq = set(lst1) # lst1 = [1, 2, 2, 3, 4, 1, 2, 7]
for each in unq:
d1[each] = lst1.count(each)
else:
print(d1)
查找满足条件的所有项的索引
from more_itertools import locate
list(locate([0, 1, 1, 0, 1, 0, 0]))
# [1, 2, 4]
list(locate(['a', 'b', 'c', 'b'], lambda x: x == 'b'))
# [1, 3]
more\u itertools
是第三方库>pip install more\u itertools
查找满足条件的所有项目的索引
from more_itertools import locate
list(locate([0, 1, 1, 0, 1, 0, 0]))
# [1, 2, 4]
list(locate(['a', 'b', 'c', 'b'], lambda x: x == 'b'))
# [1, 3]
more\u itertools
是第三方库>pip安装more\u itertools
或使用范围
(python 3):
对于(python 2):
然后(两种情况):
与预期一致。或使用范围(python 3):
对于(python 2):
然后(两种情况):
与预期一致。获取列表中一个或多个(相同)项的所有出现情况和位置
使用enumerate(alist),当元素x等于您要查找的元素时,您可以存储作为列表索引的第一个元素(n)
>>> alist = ['foo', 'spam', 'egg', 'foo']
>>> foo_indexes = [n for n,x in enumerate(alist) if x=='foo']
>>> foo_indexes
[0, 3]
>>>
让我们把函数设为findindex
这个函数将项和列表作为参数,并返回项在列表中的位置,就像我们前面看到的那样
def indexlist(item2find, list_or_string):
"Returns all indexes of an item in a list or a string"
return [n for n,item in enumerate(list_or_string) if item==item2find]
print(indexlist("1", "010101010"))
输出
简单的
输出:
0
4
获取列表中一个或多个(相同)项的所有引用和位置
使用enumerate(alist),当元素x等于您要查找的元素时,您可以存储作为列表索引的第一个元素(n)
>>> alist = ['foo', 'spam', 'egg', 'foo']
>>> foo_indexes = [n for n,x in enumerate(alist) if x=='foo']
>>> foo_indexes
[0, 3]
>>>
让我们把函数设为findindex
这个函数将项和列表作为参数,并返回项在列表中的位置,就像我们前面看到的那样
def indexlist(item2find, list_or_string):
"Returns all indexes of an item in a list or a string"
return [n for n,item in enumerate(list_or_string) if item==item2find]
print(indexlist("1", "010101010"))
输出
简单的
输出:
0
4
在python2中使用filter()
>>> q = ['Yeehaw', 'Yeehaw', 'Googol', 'B9', 'Googol', 'NSM', 'B9', 'NSM', 'Dont Ask', 'Googol']
>>> filter(lambda i: q[i]=="Googol", range(len(q)))
[2, 4, 9]
在python2中使用filter()
>>> q = ['Yeehaw', 'Yeehaw', 'Googol', 'B9', 'Googol', 'NSM', 'B9', 'NSM', 'Dont Ask', 'Googol']
>>> filter(lambda i: q[i]=="Googol", range(len(q)))
[2, 4, 9]
对循环使用:
- 带有
枚举
和a的答案更像是python,不一定更快。但是,此答案针对的是可能不允许使用其中一些的学生
- 创建一个空列表,
索引
- 使用
为范围内的i(len(x)):
创建循环,该循环基本上遍历索引位置列表[0,1,2,3,…,len(x)-1]
- 在循环中,将任何
i
添加到索引中,其中x[i]
与值
匹配