Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/282.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在列表中查找元素的所有引用_Python_List - Fatal编程技术网

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]
    匹配