index()
จะให้การเกิดขึ้นครั้งแรกของรายการในรายการ มีเคล็ดลับเรียบร้อยที่ส่งกลับดัชนีทั้งหมดในรายการหรือไม่?
index()
จะให้การเกิดขึ้นครั้งแรกของรายการในรายการ มีเคล็ดลับเรียบร้อยที่ส่งกลับดัชนีทั้งหมดในรายการหรือไม่?
คำตอบ:
คุณสามารถใช้ list comprehension:
indices = [i for i, x in enumerate(my_list) if x == "whatever"]
enumerate
ที่ 2.3 filter()
ดังนั้นใช่ถ้าคุณหลามโบราณใช้
print([i for i, x in enumerate([[1,1],[0,1]]) if x == 1])
ผลตอบแทนแทน[]
[[0, 1], [0, 0], [1, 1]]
(a == 1).nonzero()
NumPy a
ในขณะที่ไม่ใช่วิธีแก้ปัญหาสำหรับรายการโดยตรง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])
สิ่งนี้จะเร็วขึ้นอย่างมากสำหรับรายการ (อาร์เรย์) ที่มีองค์ประกอบจำนวนมากเทียบกับโซลูชันอื่น ๆ
[0]
จำเป็นต้องมี@amelia 'เพราะwhere
จะให้ผลตอบแทนเป็น tuple(array([2, 8], dtype=int64),)
all_id_resp_address
ควรจะได้np.array
list
list
และstr
เห็นได้ชัดว่าคุณผ่านไปFalse
np.where
เมื่อคุณเปรียบเทียบnp.array
กับ smth คุณได้รับอาร์เรย์ของค่าบูลีน จากนั้นnp.where
ค้นหาตำแหน่งของTrue
ค่าทั้งหมดของอาร์เรย์นั้น
วิธีใช้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, 1,000 และ 10000)
หมายเหตุ:หมายเหตุข้อควรระวังตามความคิดเห็นของ Chris_Rands: วิธีนี้เร็วกว่าความเข้าใจในรายการหากผลลัพธ์กระจัดกระจายเพียงพอ แต่ถ้ารายการมีองค์ประกอบหลายอย่างที่กำลังค้นหา (มากกว่า 15% ของรายการ) ในการทดสอบที่มีรายการ 1,000 จำนวนเต็ม) ความเข้าใจในรายการจะเร็วขึ้น
timeit.timeit
กับรายการที่สร้างแบบสุ่ม นั่นเป็นประเด็นสำคัญและฉันคิดว่านั่นอาจเป็นเหตุผลที่คุณถาม ในเวลานั้นมันไม่ได้เกิดขึ้นกับฉัน แต่ความเร็วจะเพิ่มขึ้นเป็นจริงหากผลลัพธ์นั้นกระจัดกระจายเพียงพอ ฉันเพิ่งทดสอบกับรายการที่เต็มไปด้วยองค์ประกอบเพื่อค้นหาและมันช้ากว่าความเข้าใจในรายการมาก
เกี่ยวกับ:
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]
occurrences = lambda s, lst: (i for i,e in enumerate(lst) if e == s)
list(occurrences(1, [1,2,3,1])) # = [0, 3]
more_itertools.locate
ค้นหาดัชนีสำหรับรายการทั้งหมดที่ตรงตามเงื่อนไข
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_itertools
> pip install more_itertools
เป็นห้องสมุดของบุคคลที่สาม
conda install
มีการเปิดใช้งานที่ไม่เสถียรในการทำงานเมื่อเร็ว ๆ นี้)
อีกหนึ่งวิธีการแก้ปัญหา (ขออภัยถ้าซ้ำซ้อน) สำหรับเหตุการณ์ทั้งหมด:
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)
หรือใช้range
(python 3):
l=[i for i in range(len(lst)) if lst[i]=='something...']
สำหรับ (python 2):
l=[i for i in xrange(len(lst)) if lst[i]=='something...']
แล้ว (ทั้งสองกรณี):
print(l)
เป็นไปตามที่คาดไว้
ใช้ตัวกรอง () ใน python2
>>> q = ['Yeehaw', 'Yeehaw', 'Googol', 'B9', 'Googol', 'NSM', 'B9', 'NSM', 'Dont Ask', 'Googol']
>>> filter(lambda i: q[i]=="Googol", range(len(q)))
[2, 4, 9]
คุณสามารถสร้างคำสั่งเริ่มต้น
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)
ด้วยการแจกแจง (alist) คุณสามารถเก็บองค์ประกอบแรก (n) นั่นคือดัชนีของรายการเมื่อองค์ประกอบ x เท่ากับสิ่งที่คุณมองหา
>>> alist = ['foo', 'spam', 'egg', 'foo']
>>> foo_indexes = [n for n,x in enumerate(alist) if x=='foo']
>>> foo_indexes
[0, 3]
>>>
ฟังก์ชั่นนี้ใช้ไอเท็มและรายการเป็นอาร์กิวเมนต์และส่งคืนตำแหน่งของรายการในรายการเหมือนที่เราเห็นมาก่อน
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"))
เอาท์พุต
[1, 3, 5, 7]
for n, i in enumerate([1, 2, 3, 4, 1]):
if i == 1:
print(n)
เอาท์พุท:
0
4
for-loop
:enumerate
และรายการความเข้าใจมีประสิทธิภาพมากขึ้นและ pythonic อย่างไรก็ตามคำตอบนี้มีวัตถุประสงค์เพื่อนักเรียนที่อาจไม่ได้รับอนุญาตให้ใช้ฟังก์ชั่นในตัวบางอย่างindices
for i in range(len(x)):
ซึ่งจะวนซ้ำตามรายการของตำแหน่งดัชนี[0, 1, 2, 3, ..., len(x)-1]
i
ที่x[i]
เป็นคู่ที่จะvalue
ไปindices
def get_indices(x: list, value: int) -> list:
indices = list()
for i in range(len(x)):
if x[i] == value:
indices.append(i)
return indices
n = [1, 2, 3, -50, -60, 0, 6, 9, -60, -60]
print(get_indices(n, -60))
>>> [4, 8, 9]
get_indices
มีการดำเนินการกับคำแนะนำประเภท ในกรณีนี้รายการn
เป็นพวงของint
s ดังนั้นเราจึงค้นหายังกำหนดให้เป็นvalue
int
while-loop
และ.index
:.index
ใช้try-except
สำหรับการจัดการข้อผิดพลาดเพราะValueError
จะเกิดขึ้นหากvalue
ไม่ได้อยู่ในรายการdef get_indices(x: list, value: int) -> list:
indices = list()
i = 0
while True:
try:
# find an occurrence of value and update i to that index
i = x.index(value, i)
# add i to the list
indices.append(i)
# advance i by 1
i += 1
except ValueError as e:
break
return indices
print(get_indices(n, -60))
>>> [4, 8, 9]
get_indeices
จะเร็วกว่า (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)
หากคุณต้องการค้นหาตำแหน่งขององค์ประกอบทั้งหมดระหว่างดัชนีบางอย่างคุณสามารถระบุ:
[i for i,x in enumerate([1,2,3,2]) if x==2 & 2<= i <=3] # -> [3]