ฉันกำลังวนซ้ำรายการและฉันต้องการพิมพ์ดัชนีของรายการหากตรงตามเงื่อนไข ฉันจะทำสิ่งนี้ได้อย่างไร
ตัวอย่าง:
testlist = [1,2,3,5,3,1,2,1,6]
for item in testlist:
if item == 1:
print position
ฉันกำลังวนซ้ำรายการและฉันต้องการพิมพ์ดัชนีของรายการหากตรงตามเงื่อนไข ฉันจะทำสิ่งนี้ได้อย่างไร
ตัวอย่าง:
testlist = [1,2,3,5,3,1,2,1,6]
for item in testlist:
if item == 1:
print position
คำตอบ:
อืมม มีคำตอบที่มีรายการความเข้าใจที่นี่ แต่มันหายไป
ที่นี่:
[i for i,x in enumerate(testlist) if x == 1]
ตัวอย่าง:
>>> testlist
[1, 2, 3, 5, 3, 1, 2, 1, 6]
>>> [i for i,x in enumerate(testlist) if x == 1]
[0, 5, 7]
ปรับปรุง:
ตกลงคุณต้องการนิพจน์ตัวสร้างเราจะมีตัวสร้างนิพจน์ นี่คือรายการความเข้าใจอีกครั้งใน for for loop:
>>> for i in [i for i,x in enumerate(testlist) if x == 1]:
... print i
...
0
5
7
ตอนนี้เราจะสร้างเครื่องกำเนิด ...
>>> (i for i,x in enumerate(testlist) if x == 1)
<generator object at 0x6b508>
>>> for i in (i for i,x in enumerate(testlist) if x == 1):
... print i
...
0
5
7
และเพียงพอเราสามารถกำหนดให้ตัวแปรและใช้จากที่นั่น ...
>>> gen = (i for i,x in enumerate(testlist) if x == 1)
>>> for i in gen: print i
...
0
5
7
และคิดว่าฉันเคยเขียน FORTRAN
args = ['x', '-p1', 'v1', '-p2', 'v2']
มากมาย: . จากนั้นคำสั่งargs[[i for i, x in enumerate(args) if x == '-p1'][0] + 1]
จะกลับมา'v1'
แล้วเรื่องต่อไปนี้ล่ะ?
print testlist.index(element)
หากคุณไม่แน่ใจว่าองค์ประกอบที่ต้องการค้นหานั้นอยู่ในรายการจริงหรือไม่คุณสามารถเพิ่มการตรวจสอบเบื้องต้นเช่น
if element in testlist:
print testlist.index(element)
หรือ
print(testlist.index(element) if element in testlist else None)
หรือ "วิธี pythonic" ซึ่งฉันไม่ชอบมากเพราะรหัสไม่ชัดเจน แต่บางครั้งก็มีประสิทธิภาพมากกว่า
try:
print testlist.index(element)
except ValueError:
pass
ValueError
ใช้การแจกแจง:
testlist = [1,2,3,5,3,1,2,1,6]
for position, item in enumerate(testlist):
if item == 1:
print position
for i in xrange(len(testlist)):
if testlist[i] == 1:
print i
xrange แทนช่วงตามที่ร้องขอ (ดูความคิดเห็น)
xrange
มีการลดขนาดใน Python 3.x เนื่องจากใหม่range
คือรุ่นเก่าxrange
นี่เป็นอีกวิธีในการทำสิ่งนี้:
try:
id = testlist.index('1')
print testlist[id]
except ValueError:
print "Not Found"
[x for x in range(len(testlist)) if testlist[x]==1]
ลองด้านล่าง:
testlist = [1,2,3,5,3,1,2,1,6]
position=0
for i in testlist:
if i == 1:
print(position)
position=position+1
หากรายการของคุณมีขนาดใหญ่พอและคุณคาดหวังว่าจะพบมูลค่าในดัชนีเพียงเล็กน้อยให้พิจารณาว่ารหัสนี้สามารถทำงานได้เร็วขึ้นมากเพราะคุณไม่ต้องวนซ้ำทุกค่าในรายการ
lookingFor = 1
i = 0
index = 0
try:
while i < len(testlist):
index = testlist.index(lookingFor,i)
i = index + 1
print index
except ValueError: #testlist.index() cannot find lookingFor
pass
หากคุณคาดหวังว่าจะพบมูลค่ามากคุณก็ควรผนวก "ดัชนี" ไว้ในรายการแล้วพิมพ์รายการท้ายเพื่อประหยัดเวลาต่อการทำซ้ำ
ฉันคิดว่าอาจเป็นประโยชน์ในการใช้ curselection () วิธีการจากห้องสมุด thte Tkinter:
from Tkinter import *
listbox.curselection()
วิธีนี้ใช้ได้กับวิดเจ็ตกล่องรายการ Tkinter ดังนั้นคุณจะต้องสร้างหนึ่งในนั้นแทนรายการ
นี่จะส่งคืนตำแหน่งดังนี้:
('0',) (แม้ว่า Tkinter เวอร์ชั่นที่ใหม่กว่าอาจส่งคืนรายการของ ints แทน)
ซึ่งสำหรับตำแหน่งแรกและหมายเลขจะเปลี่ยนตามตำแหน่งรายการ
สำหรับข้อมูลเพิ่มเติมดูที่หน้านี้: http://effbot.org/tkinterbook/listbox.htm
ทักทาย.
ทำไมสิ่งที่ซับซ้อน?
testlist = [1,2,3,5,3,1,2,1,6]
for position, item in enumerate(testlist):
if item == 1:
print position
เพียงเพื่อแสดงตัวอย่างที่สมบูรณ์พร้อมกับสิ่งinput_list
ที่มีsearies1
(ตัวอย่าง: input_list [0]) ที่คุณต้องการค้นหาseries2
(เช่น: input_list [1]) และรับดัชนีชุดที่ 2 หากมีอยู่ในซีรีส์ 1
หมายเหตุ: คุณcertain condition
จะแสดงออกด้วยแลมบ์ดาหากเงื่อนไขง่าย
input_list = [[1,2,3,4,5,6,7],[1,3,7]]
series1 = input_list[0]
series2 = input_list[1]
idx_list = list(map(lambda item: series1.index(item) if item in series1 else None, series2))
print(idx_list)
เอาท์พุท:
[0, 2, 6]
testlist = [1,2,3,5,3,1,2,1,6]
for id, value in enumerate(testlist):
if id == 1:
print testlist[id]
ฉันเดาว่ามัน exacly สิ่งที่คุณต้องการ ;-) 'id' จะเป็นดัชนีของค่าในรายการเสมอ