วิธีที่เร็วที่สุดในการตรวจสอบว่ามีค่าอยู่ในรายการหรือไม่


816

วิธีที่เร็วที่สุดที่จะทราบว่ามีค่าอยู่ในรายการ (รายการที่มีค่าหลายล้านค่าอยู่ในรายการ) และดัชนีคืออะไร

ฉันรู้ว่าค่าทั้งหมดในรายการไม่เหมือนกันในตัวอย่างนี้

วิธีแรกที่ฉันลองใช้คือ (3.8 วินาทีในรหัสจริงของฉัน):

a = [4,2,3,1,5,6]

if a.count(7) == 1:
    b=a.index(7)
    "Do something with variable b"

วิธีที่สองที่ฉันลองคือ (2x เร็วกว่า: 1.9 วินาทีสำหรับรหัสจริงของฉัน):

a = [4,2,3,1,5,6]

try:
    b=a.index(7)
except ValueError:
    "Do nothing"
else:
    "Do something with variable b"

วิธีการที่เสนอจากผู้ใช้ Stack Overflow (2.74 วินาทีสำหรับรหัสจริงของฉัน):

a = [4,2,3,1,5,6]
if 7 in a:
    a.index(7)

ในรหัสจริงของฉันวิธีแรกใช้เวลา 3.81 วินาทีและวิธีที่สองใช้เวลา 1.88 วินาที เป็นการปรับปรุงที่ดี แต่:

ฉันเป็นผู้เริ่มต้นด้วย Python / การเขียนสคริปต์และมีวิธีที่เร็วกว่าในการทำสิ่งเดียวกันและประหยัดเวลาในการประมวลผลมากขึ้นหรือไม่

คำอธิบายเฉพาะเพิ่มเติมสำหรับแอปพลิเคชันของฉัน:

ใน Blender API ฉันสามารถเข้าถึงรายการอนุภาค:

particles = [1, 2, 3, 4, etc.]

จากที่นั่นฉันสามารถเข้าถึงตำแหน่งของอนุภาค:

particles[x].location = [x,y,z]

และสำหรับแต่ละอนุภาคฉันทดสอบว่าเพื่อนบ้านมีอยู่ด้วยการค้นหาแต่ละตำแหน่งของอนุภาคดังนี้:

if [x+1,y,z] in particles.location
    "Find the identity of this neighbour particle in x:the particle's index
    in the array"
    particles.index([x+1,y,z])

5
ในไพ ธ อนสิ่งที่อยู่ในวงเล็บเหลี่ยมเรียกว่ารายการไม่ใช่อาร์เรย์ แทนที่จะใช้รายการใช้ชุด หรือเก็บรายการของคุณเรียงลำดับแล้วใช้bisectโมดูล
Steven Rumbalski

ดังนั้นคุณจำเป็นต้องเล่นดัชนี หรือว่าไม่ได้สั่งเรื่องจริงและคุณแค่ต้องการทำการทดสอบเรือสมาชิกจุดตัด ฯลฯ ตามคำพูดมันขึ้นอยู่กับสิ่งที่คุณพยายามทำ ชุดอาจใช้งานได้สำหรับคุณและจากนั้นเป็นคำตอบที่ดีมาก แต่เราไม่สามารถบอกได้จากรหัสที่คุณแสดง

2
อาจเป็นไปได้ว่าคุณต้องระบุคำถามที่คุณไม่ต้องการค่า แต่เป็นดัชนี
โรมัน Bodnarchuk

ฉันแก้ไขคำถามของฉันและพยายามอธิบายให้ชัดเจนยิ่งขึ้นว่าฉันต้องการทำอะไร ... ฉันหวังว่าอย่างนั้น ...
Jean-Francois Gallant

1
@StevenRumbalski: เนื่องจากชุดไม่สามารถมีเนื้อหาที่ซ้ำกันในขณะที่จีนต้องการที่จะเก็บตำแหน่งของอนุภาค (x, y, z อาจจะเหมือนกัน) เราไม่สามารถใช้ชุดในกรณีนี้ได้
Hieu Vo

คำตอบ:


1568
7 in a

วิธีที่ชัดเจนและเร็วที่สุดที่จะทำ

คุณสามารถลองใช้ a setแต่การสร้างชุดที่จากรายการของคุณอาจใช้เวลานานกว่าการทดสอบการเป็นสมาชิกที่เร็วขึ้นจะช่วยได้ วิธีเดียวที่จะมั่นใจได้คือการสร้างมาตรฐานที่ดี (สิ่งนี้ยังขึ้นอยู่กับการปฏิบัติการที่คุณต้องการ)


5
แต่คุณไม่มีดัชนีและการได้รับจะทำให้คุณเสียค่าใช้จ่ายในการบันทึก
rodrigo

6
ไลค์: ถ้า 7 ใน a: b = a.index (7)?
Jean-Francois Gallant

26
@StevenRumbalski: ชุดเป็นเพียงตัวเลือกถ้าคุณไม่ต้องการให้สั่ง (และมีดัชนี) และชุดที่มีการกล่าวถึงอย่างชัดเจนในคำตอบมันก็ยังให้คำตอบที่ตรงไปตรงมาคำถามเป็น OP ถาม ฉันไม่คิดว่านี่จะคุ้มค่า -1

ฉันแก้ไขคำถามของฉันและพยายามอธิบายให้ชัดเจนยิ่งขึ้นว่าฉันต้องการทำอะไร ... ฉันหวังว่าอย่างนั้น ...
Jean-Francois Gallant

1
โอเคฉันลองใช้วิธีของคุณในรหัสจริงของฉันและอาจต้องใช้เวลานานกว่านี้เล็กน้อยเพราะฉันจำเป็นต้องรู้ดัชนีของค่า ด้วยวิธีที่สองของฉันฉันตรวจสอบว่ามีอยู่และรับดัชนีในเวลาเดียวกัน
Jean-Francois Gallant

213

ตามที่ระบุโดยผู้อื่นinอาจช้ามากสำหรับรายการขนาดใหญ่ นี่คือการเปรียบเทียบผลการดำเนินงานสำหรับบางคนin, และset bisectหมายเหตุเวลา (เป็นวินาที) อยู่ในระดับของบันทึก

ป้อนคำอธิบายรูปภาพที่นี่

รหัสสำหรับการทดสอบ:

import random
import bisect
import matplotlib.pyplot as plt
import math
import time

def method_in(a,b,c):
    start_time = time.time()
    for i,x in enumerate(a):
        if x in b:
            c[i] = 1
    return(time.time()-start_time)   

def method_set_in(a,b,c):
    start_time = time.time()
    s = set(b)
    for i,x in enumerate(a):
        if x in s:
            c[i] = 1
    return(time.time()-start_time)

def method_bisect(a,b,c):
    start_time = time.time()
    b.sort()
    for i,x in enumerate(a):
        index = bisect.bisect_left(b,x)
        if index < len(a):
            if x == b[index]:
                c[i] = 1
    return(time.time()-start_time)

def profile():
    time_method_in = []
    time_method_set_in = []
    time_method_bisect = []

    Nls = [x for x in range(1000,20000,1000)]
    for N in Nls:
        a = [x for x in range(0,N)]
        random.shuffle(a)
        b = [x for x in range(0,N)]
        random.shuffle(b)
        c = [0 for x in range(0,N)]

        time_method_in.append(math.log(method_in(a,b,c)))
        time_method_set_in.append(math.log(method_set_in(a,b,c)))
        time_method_bisect.append(math.log(method_bisect(a,b,c)))

    plt.plot(Nls,time_method_in,marker='o',color='r',linestyle='-',label='in')
    plt.plot(Nls,time_method_set_in,marker='o',color='b',linestyle='-',label='set')
    plt.plot(Nls,time_method_bisect,marker='o',color='g',linestyle='-',label='bisect')
    plt.xlabel('list size', fontsize=18)
    plt.ylabel('log(time)', fontsize=18)
    plt.legend(loc = 'upper left')
    plt.show()

15
รักคำตอบที่ถูกตัดและวางรหัสเช่นนี้ในคำตอบ ในการบันทึกผู้อื่นในเวลาไม่กี่วินาทีคุณจะต้องนำเข้า 3 รายการ: import random / import bisect / import matplotlib.pyplot as pltแล้วโทร:profile()
kghastie

1
งูหลามรุ่นไหน?
cowbert

ยอดเยี่ยมเสมอในการรับรหัส แต่หัวขึ้นฉันต้องนำเข้าเวลาทำงาน
whla

และอย่าลืมrange()วัตถุที่ต่ำต้อย เมื่อใช้var in [integer list]งานดูว่าrange()วัตถุสามารถสร้างแบบจำลองลำดับเดียวกันได้หรือไม่ ประสิทธิภาพใกล้เคียงกับชุด แต่มีความกระชับมากกว่า
Martijn Pieters

37

setคุณสามารถใส่รายการของคุณให้เป็น การค้นหาชุดมีประสิทธิภาพมาก

ลอง:

s = set(a)
if 7 in s:
  # do stuff

แก้ไขในความคิดเห็นที่คุณบอกว่าคุณต้องการได้รับดัชนีขององค์ประกอบ น่าเสียดายที่เซตไม่มีแนวคิดเกี่ยวกับตำแหน่งองค์ประกอบ อีกทางเลือกหนึ่งคือจัดเรียงรายการของคุณล่วงหน้าแล้วใช้การค้นหาแบบไบนารีทุกครั้งที่คุณต้องการค้นหาองค์ประกอบ


และถ้าหลังจากนั้นฉันอยากรู้ดัชนีของค่านี้, มันเป็นไปได้และคุณมีวิธีที่รวดเร็วในการทำมัน?
Jean-Francois Gallant

@ Jean-FrancoisGallant: ในกรณีนี้ชุดจะไม่ใช้งานมากนัก คุณสามารถเรียงลำดับรายการล่วงหน้าแล้วใช้การค้นหาแบบไบนารี โปรดดูคำตอบที่อัปเดตของฉัน
NPE

ฉันแก้ไขคำถามของฉันและพยายามอธิบายให้ชัดเจนยิ่งขึ้นว่าฉันต้องการทำอะไร ... ฉันหวังว่าอย่างนั้น ...
Jean-Francois Gallant

30
def check_availability(element, collection: iter):
    return element in collection

การใช้

check_availability('a', [1,2,3,4,'a','b','c'])

ฉันเชื่อว่านี่เป็นวิธีที่เร็วที่สุดในการทราบว่ามูลค่าที่เลือกอยู่ในอาร์เรย์หรือไม่


71
return 'a' in a?
Shikiryu

4
คุณต้องใส่รหัสในคำจำกัดความ: def listValue (): a = [1,2,3,4, 'a', 'b', 'c'] ส่งคืน 'a' in ax = listValue () พิมพ์ ( x)
Tenzin

12
มันเป็นคำตอบ Python ที่ถูกต้องเพราะมันไม่ดีรหัสที่สามารถอ่านได้
Rick Henderson

1
ระวังนะ! แมตช์นี้ในขณะนี้อาจเป็นสิ่งที่คุณไม่คาดคิด:o='--skip'; o in ("--skip-ias"); # returns True !
อเล็กซ์ F

3
@Alex F inผู้ปฏิบัติงานใช้วิธีเดียวกันในการทดสอบการเป็นสมาชิกสตริงย่อย ส่วนที่สับสนที่นี่น่า("hello")จะไม่ใช่ tuple แบบค่าเดียวในขณะที่("hello",)- คอมม่าสร้างความแตกต่าง o in ("--skip-ias",)เป็นไปFalseตามที่คาดไว้
MoxieBall

16
a = [4,2,3,1,5,6]

index = dict((y,x) for x,y in enumerate(a))
try:
   a_index = index[7]
except KeyError:
   print "Not found"
else:
   print "found"

นี่จะเป็นความคิดที่ดีถ้า a ไม่เปลี่ยนแปลงและดังนั้นเราสามารถทำ dict () ส่วนหนึ่งครั้งแล้วใช้มันซ้ำ ๆ หากมีการเปลี่ยนแปลงโปรดให้รายละเอียดเพิ่มเติมเกี่ยวกับสิ่งที่คุณกำลังทำ


มันทำงานได้ แต่ไม่ได้ใช้งานในรหัสของฉัน: "TypeError: ประเภท unhashable: 'list'
Jean-Francois Gallant

1
@ Jean-FrancoisGallant อาจเป็นเพราะคุณกำลังใช้รายการที่คุณควรใช้สิ่งอันดับ หากคุณต้องการคำแนะนำที่ครอบคลุมเกี่ยวกับวิธีเพิ่มความเร็วโค้ดของคุณคุณควรโพสต์ไว้ที่ codereview.stackexchange.com คุณจะได้รับคำแนะนำเกี่ยวกับสไตล์และประสิทธิภาพ
Winston Ewert

นี่เป็นวิธีแก้ปัญหาที่ฉลาดมาก แทนที่จะลองสร้างยกเว้นฉันจะทำ: a_index = index.get (7) ซึ่งจะใช้ค่าเริ่มต้นเป็นไม่มีหากไม่พบกุญแจ
murphsp1

14

คำถามเดิมคือ:

วิธีที่เร็วที่สุดที่จะทราบว่ามีค่าอยู่ในรายการ (รายการที่มีค่าหลายล้านค่าอยู่ในรายการ) และดัชนีคืออะไร

ดังนั้นจึงมีสองสิ่งที่จะค้นหา:

  1. เป็นรายการในรายการและ
  2. ดัชนีคืออะไร (ถ้าอยู่ในรายการ)

ต่อสิ่งนี้ฉันแก้ไขรหัส @xslittlegrass เพื่อคำนวณดัชนีในทุกกรณีและเพิ่มวิธีเพิ่มเติม

ผล

ป้อนคำอธิบายรูปภาพที่นี่

วิธีการคือ:

  1. ใน - โดยทั่วไปถ้า x ใน b: คืน b.index (x)
  2. ลอง - ลอง / จับบน b.index (x) (ข้ามต้องตรวจสอบว่า x เป็น b)
  3. ชุด - โดยทั่วไปถ้า x ในชุด (b): return b.index (x)
  4. bisect - จัดเรียง b ด้วยดัชนีของมันค้นหาไบนารีสำหรับ x ในเรียงลำดับ (b) Note mod จาก @xslittlegrass ที่ส่งคืนดัชนีใน b ที่เรียงลำดับแทนที่จะเป็น b ดั้งเดิม)
  5. ย้อนกลับ - สร้างพจนานุกรมค้นหาแบบย้อนกลับ d สำหรับ b; จากนั้น d [x] ให้ดัชนีของ x

ผลลัพธ์แสดงว่าวิธีที่ 5 นั้นเร็วที่สุด

ที่น่าสนใจลองและวิธีการตั้งค่าจะเทียบเท่าในเวลา


รหัสทดสอบ

import random
import bisect
import matplotlib.pyplot as plt
import math
import timeit
import itertools

def wrapper(func, *args, **kwargs):
    " Use to produced 0 argument function for call it"
    # Reference https://www.pythoncentral.io/time-a-python-function/
    def wrapped():
        return func(*args, **kwargs)
    return wrapped

def method_in(a,b,c):
    for i,x in enumerate(a):
        if x in b:
            c[i] = b.index(x)
        else:
            c[i] = -1
    return c

def method_try(a,b,c):
    for i, x in enumerate(a):
        try:
            c[i] = b.index(x)
        except ValueError:
            c[i] = -1

def method_set_in(a,b,c):
    s = set(b)
    for i,x in enumerate(a):
        if x in s:
            c[i] = b.index(x)
        else:
            c[i] = -1
    return c

def method_bisect(a,b,c):
    " Finds indexes using bisection "

    # Create a sorted b with its index
    bsorted = sorted([(x, i) for i, x in enumerate(b)], key = lambda t: t[0])

    for i,x in enumerate(a):
        index = bisect.bisect_left(bsorted,(x, ))
        c[i] = -1
        if index < len(a):
            if x == bsorted[index][0]:
                c[i] = bsorted[index][1]  # index in the b array

    return c

def method_reverse_lookup(a, b, c):
    reverse_lookup = {x:i for i, x in enumerate(b)}
    for i, x in enumerate(a):
        c[i] = reverse_lookup.get(x, -1)
    return c

def profile():
    Nls = [x for x in range(1000,20000,1000)]
    number_iterations = 10
    methods = [method_in, method_try, method_set_in, method_bisect, method_reverse_lookup]
    time_methods = [[] for _ in range(len(methods))]

    for N in Nls:
        a = [x for x in range(0,N)]
        random.shuffle(a)
        b = [x for x in range(0,N)]
        random.shuffle(b)
        c = [0 for x in range(0,N)]

        for i, func in enumerate(methods):
            wrapped = wrapper(func, a, b, c)
            time_methods[i].append(math.log(timeit.timeit(wrapped, number=number_iterations)))

    markers = itertools.cycle(('o', '+', '.', '>', '2'))
    colors = itertools.cycle(('r', 'b', 'g', 'y', 'c'))
    labels = itertools.cycle(('in', 'try', 'set', 'bisect', 'reverse'))

    for i in range(len(time_methods)):
        plt.plot(Nls,time_methods[i],marker = next(markers),color=next(colors),linestyle='-',label=next(labels))

    plt.xlabel('list size', fontsize=18)
    plt.ylabel('log(time)', fontsize=18)
    plt.legend(loc = 'upper left')
    plt.show()

profile()

พิมพ์คำอธิบายของคุณ ("reverse loop up" ควรเป็น "reverse lookup," ไม่?)
Cam U

@ CamU - ใช่แก้ไขแล้ว ขอบคุณที่สังเกต
DarrylG

7

ดูเหมือนว่าแอปพลิเคชันของคุณอาจได้รับประโยชน์จากการใช้โครงสร้างข้อมูล Bloom Filter

ในระยะสั้นการค้นหาตัวกรองบลูมสามารถบอกคุณได้อย่างรวดเร็วหากค่าไม่ได้กำหนดอย่างแน่นอนในชุด มิฉะนั้นคุณสามารถทำการค้นหาช้าลงเพื่อรับดัชนีของค่าที่อาจเป็นไปได้ในรายการ ดังนั้นหากแอปพลิเคชันของคุณมีแนวโน้มที่จะได้รับผลลัพธ์ "ไม่พบ" บ่อยกว่าผลลัพธ์ "พบ" คุณอาจเห็นความเร็วเพิ่มขึ้นโดยการเพิ่มตัวกรอง Bloom

สำหรับรายละเอียด Wikipedia ให้ภาพรวมที่ดีเกี่ยวกับวิธีการทำงานของตัวกรอง Bloom และการค้นหาเว็บสำหรับ "ห้องสมุดตัวกรอง Bloom Bloom" จะให้การใช้งานที่มีประโยชน์อย่างน้อยสองอย่าง


7

พึงระวังว่าinโอเปอเรเตอร์ทดสอบไม่เพียง แต่ความเสมอภาค ( ==) แต่ยังใช้เอกลักษณ์ ( is), inตรรกะสำหรับlists นั้นเทียบเท่ากับสิ่งต่อไปนี้ (จริง ๆ แล้วเขียนเป็นภาษา C และไม่ใช่ Python แม้ว่าอย่างน้อยใน CPython):

for element in s:
    if element is target:
        # fast check for identity implies equality
        return True
    if element == target:
        # slower check for actual equality
        return True
return False

ในกรณีส่วนใหญ่รายละเอียดนี้ไม่เกี่ยวข้อง แต่ในบางสถานการณ์มันอาจทำให้ผู้ฝึกหัดของ Python ประหลาดใจตัวอย่างเช่นnumpy.NANมีคุณสมบัติที่ผิดปกติของการไม่เท่ากับตัวเอง :

>>> import numpy
>>> numpy.NAN == numpy.NAN
False
>>> numpy.NAN is numpy.NAN
True
>>> numpy.NAN in [numpy.NAN]
True

หากต้องการแยกแยะระหว่างกรณีผิดปกติเหล่านี้คุณสามารถใช้any():

>>> lst = [numpy.NAN, 1 , 2]
>>> any(element == numpy.NAN for element in lst)
False
>>> any(element is numpy.NAN for element in lst)
True 

สังเกตinตรรกะlistของ s ด้วยany()จะเป็น:

any(element is target or element == target for element in lst)

อย่างไรก็ตามฉันควรเน้นว่านี่เป็นกรณีที่เป็นขอบและสำหรับกรณีส่วนใหญ่inผู้ปฏิบัติงานจะได้รับการปรับให้เหมาะสมอย่างมากและแน่นอนว่าคุณต้องการอะไร (ไม่ว่าจะเป็นแบบ a listหรือแบบ a set)


NAN == NAN ที่ส่งคืนค่าเท็จไม่มีอะไรผิดปกติเกี่ยวกับมัน มันเป็นพฤติกรรมที่กำหนดไว้ในมาตรฐาน IEEE 754
TommyD


2

@ โซลูชั่นของ Winston Ewert ให้อัตราความเร็วสูงมากสำหรับรายการที่มีขนาดใหญ่มาก แต่คำตอบของ stackoverflow นี้ระบุว่าการลอง: / ยกเว้น: / else: การสร้างจะช้าลงหากถึงการแยกสาขาบ่อยครั้ง อีกทางเลือกหนึ่งคือการใช้ประโยชน์จาก.get()วิธีการสำหรับ dict:

a = [4,2,3,1,5,6]

index = dict((y, x) for x, y in enumerate(a))

b = index.get(7, None)
if b is not None:
    "Do something with variable b"

.get(key, default)วิธีเป็นเพียงสำหรับกรณีที่คุณไม่สามารถรับประกันที่สำคัญจะอยู่ในบริการพจนานุกรม หากมีคีย์มันจะส่งคืนค่า (ตามต้องการ) แต่เมื่อไม่มีคีย์จะส่งคืนค่าเริ่มต้นของคุณ (ที่นี่) คุณต้องให้แน่ใจว่าในกรณีนี้ว่าเริ่มต้นได้รับการแต่งตั้งจะไม่อยู่ในdict[key].get()Nonea


1

นี่ไม่ใช่รหัส แต่เป็นอัลกอริทึมสำหรับการค้นหาที่รวดเร็วมาก

หากรายการและค่าของคุณกำลังมองหาเป็นตัวเลขทั้งหมดนี้เป็นเรื่องง่าย หากสตริง: ดูที่ด้านล่าง:

  • ให้ "n" เป็นความยาวของรายการของคุณ
  • - ขั้นตอนทางเลือก: หากคุณต้องการดัชนีขององค์ประกอบ: เพิ่มคอลัมน์ที่สองในรายการที่มีดัชนีปัจจุบันขององค์ประกอบ (0 ถึง n-1) - ดูในภายหลัง
  • สั่งซื้อรายการหรือสำเนาของคุณ (.sort ())
  • วนซ้ำผ่าน:
    • เปรียบเทียบหมายเลขของคุณกับองค์ประกอบ n / 2 ของรายการ
      • หากมีขนาดใหญ่ขึ้นให้วนซ้ำอีกครั้งระหว่างดัชนี n / 2-n
      • ถ้าเล็กลงให้วนซ้ำอีกครั้งระหว่างดัชนี 0-n / 2
      • ถ้าเหมือนกัน: คุณพบมัน
  • ทำการ จำกัด รายการให้แคบลงจนกว่าคุณจะพบหรือมี 2 หมายเลขเท่านั้น (ด้านล่างและด้านบนของรายการที่คุณต้องการ)
  • สิ่งนี้จะค้นหาองค์ประกอบใด ๆ ในขั้นสูงสุด 19 ขั้นตอนสำหรับรายการ 1.000.000 (บันทึก (2) n เพื่อความแม่นยำ)

หากคุณต้องการตำแหน่งเดิมของหมายเลขให้มองหาในคอลัมน์ดัชนีคอลัมน์ที่สอง

หากรายการของคุณไม่ได้ทำจากตัวเลขวิธีการยังคงใช้งานได้และจะเร็วที่สุด แต่คุณอาจต้องกำหนดฟังก์ชันที่สามารถเปรียบเทียบ / สั่งซื้อสตริงได้

แน่นอนว่าสิ่งนี้ต้องการการลงทุนของวิธีการเรียง () แต่ถ้าคุณนำรายการที่เหมือนกันมาตรวจสอบซ้ำมันอาจจะคุ้มค่า


26
คุณลืมที่จะพูดถึงว่าอัลกอริทึมที่คุณอธิบายนั้นเป็นการสืบค้นแบบไบนารี่ง่ายๆ
diugalde

0

เนื่องจากคำถามนั้นไม่ควรถูกเข้าใจว่าเป็นวิธีการทางเทคนิคที่เร็วที่สุดเสมอ - ฉันมักจะแนะนำวิธีที่เร็วที่สุดในการเข้าใจ / เขียน: รายการความเข้าใจหนึ่งบรรทัด

[i for i in list_from_which_to_search if i in list_to_search_in]

ฉันมีlist_to_search_inรายการทั้งหมดและต้องการคืนดัชนีของรายการในlist_from_which_to_searchกับรายการทั้งหมดและอยากจะกลับดัชนีของรายการในที่

ส่งคืนดัชนีในรายการที่ดี

มีวิธีอื่น ๆ ในการตรวจสอบปัญหานี้ - อย่างไรก็ตามความเข้าใจในรายการนั้นรวดเร็วพอและเพิ่มความจริงของการเขียนมันเร็วพอเพื่อแก้ปัญหา


-2

สำหรับฉันคือ 0.030 วินาที (จริง), 0.026 วินาที (ผู้ใช้) และ 0.004 วินาที (sys)

try:
print("Started")
x = ["a", "b", "c", "d", "e", "f"]

i = 0

while i < len(x):
    i += 1
    if x[i] == "e":
        print("Found")
except IndexError:
    pass

-2

รหัสเพื่อตรวจสอบว่ามีสององค์ประกอบอยู่ในอาร์เรย์ที่มีผลิตภัณฑ์เท่ากับ k:

n = len(arr1)
for i in arr1:
    if k%i==0:
        print(i)
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.