তালিকায় আইটেমের অবস্থান কীভাবে পাবেন?


169

আমি একটি তালিকাতে পুনরাবৃত্তি করছি এবং আইটেমটি যদি একটি নির্দিষ্ট শর্ত পূরণ করে তবে আমি তার সূচি মুদ্রণ করতে চাই। আমি এই কিভাবে করব?

উদাহরণ:

testlist = [1,2,3,5,3,1,2,1,6]
for item in testlist:
    if item == 1:
        print position

উত্তর:


280

হুম। এখানে একটি তালিকা বোঝার সাথে একটি উত্তর ছিল, কিন্তু এটি অদৃশ্য হয়ে গেছে।

এখানে:

 [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 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

এবং ভাবতে আমি ফোরট্রান লিখতাম।


6
কার্যকরী প্রোগ্রামিংয়ের প্রশ্নবিদ্ধ হওয়ার সম্ভবত 25 বছর পরে, আমি মনে করি আমি অবশেষে ক্লু পাচ্ছি। তালিকা বোঝা দা বোমা হয়।
চার্লি মার্টিন

15
আমি মনে করি আপনার বোঝানো হচ্ছে "একক বর্ণ" এবং সত্যই, এই উদাহরণের একটি দীর্ঘ নামটির আর কোনও তথ্য সামগ্রী থাকবে না।
চার্লি মার্টিন 19

2
দুর্দান্ত উত্তরের জন্য ধন্যবাদ। আমি মনে করি @ নাইলারের মন্তব্যটি জেনারেটরের উদাহরণে একটি লাইনে দুটি পৃথক প্রসঙ্গে আপনি 'i' ব্যবহার করেছেন এই সত্যের সাথে সম্পর্কিত হতে পারে; একটি বোঝার ভিতরে এবং অন্যটি এর মাধ্যমে পুনরাবৃত্তি করতে। আমি জানি এটি আমাকে এক সেকেন্ডের জন্য ফেলে দিয়েছে।
ব্রাউন 14

1
@ চর্লিমার্টিন আপনি একক অক্ষর ভেরিয়েবলের জন্য সাধারণ প্রচলিত আইটেমের চেয়ে সূচকের জন্য 'i' ব্যবহার করেন i সূচককে 'সূচক' এবং আইটেমটির 'আইটেম' নামকরণ অস্পষ্টতা দূর করবে। অতিরিক্তভাবে আপনি এমন কোনও পিতামাতার প্রতি জবাব দিচ্ছেন যা 'আইটেম' এবং 'অবস্থান' ব্যবহার করে এবং আপনার উত্তরে মূল কোডটির কিছু অংশ অপ্রয়োজনে নামকরণ না করা ভাল আচরণ ners
মাইকম্যাকানা

1
সুপার সিনট্যাক্স: ও) আপনি সহজেই একটি কমান্ড লাইন প্যারামিটার পেতে পারেন। যাক আর্গুমেন্ট একটি অ্যারের থাকে: args = ['x', '-p1', 'v1', '-p2', 'v2']। তারপরে কমান্ডটি args[[i for i, x in enumerate(args) if x == '-p1'][0] + 1]ফিরে আসে'v1'
থিওডর কেনস্টাইন

170

নিম্নলিখিত সম্পর্কে কি?

print testlist.index(element)

উপাদানটি তালিকার তালিকায় আসলে রয়েছে কিনা তা আপনি যদি নিশ্চিত না হন তবে আপনি প্রাথমিক চেক যোগ করতে পারেন, পছন্দ করুন

if element in testlist:
    print testlist.index(element)

অথবা

print(testlist.index(element) if element in testlist else None)

বা "পাইথোনিক ওয়ে", যা আমি এতটা পছন্দ করি না কারণ কোড কম স্পষ্ট হয় তবে কখনও কখনও আরও দক্ষ হয়,

try:
    print testlist.index(element)
except ValueError:
    pass

5
অ্যাক্সেস করার আগে পরীক্ষার পরিবর্তে, আপনি কেবল চেষ্টা করতে পারেন এবং পরীক্ষা করতে পারেনValueError
ক্রেটেনকো

আমি মনে করি যে তিনি সমস্ত ঘটনা সন্ধান করতে চান, আপনি কেবল প্রথমটি দিয়েছেন বলে মনে হয়।
tfv

@tfv প্রশ্নটি "আইটেম" বলে এবং "আইটেম" না বলে আপনি কীভাবে এই সিদ্ধান্তে আসতে পারেন তা আমি দেখতে পাচ্ছি না।
মিমজেজ

40

গণনা করুন:

testlist = [1,2,3,5,3,1,2,1,6]
for position, item in enumerate(testlist):
    if item == 1:
        print position

10
for i in xrange(len(testlist)):
  if testlist[i] == 1:
    print i

অনুরোধ হিসাবে পরিসীমা পরিবর্তে xrange (মন্তব্য দেখুন)।


এক্সরেঞ্জ () - রেঞ্জ () সহ রেঞ্জ () প্রতিস্থাপন করে একটি তালিকা তৈরি করে, এক্সরেঞ্জ () একটি পুনরুক্তি তৈরি করে। xrange () waaaay কম মেমরি ব্যবহার করে এবং ইনিটাল কলটি দ্রুত।
gnud

2
আমি পাইথন 2 প্রোগ্রামে বৃহত তালিকার জন্য সম্মত। নোট করুন যে 'রেঞ্জ' এখনও অজগর 3 তে কাজ করবে (এবং এক্সরেঞ্জ আইআরসি-র মতো কাজ করবে)। 'এক্সরেঞ্জ' ডায়নোসরদের পথে চলছে।
জাকবার

2
আপডেট: xrangeপাইথন ৩.x এ সরানো হয়েছে, নতুনটি rangeপুরানো হিসাবেxrange
-ওহ




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

আপনি যদি মানটি অনেক খুঁজে পেতে চান তবে আপনার কেবলমাত্র একটি তালিকার জন্য "সূচক" যুক্ত করা উচিত এবং প্রতি পুনরাবৃত্তির সময় সাশ্রয়ের জন্য তালিকাটি শেষে প্রিন্ট করা উচিত।


আমি কিছু সময় পরীক্ষা করেছিলাম। তালিকাটি বোঝার কৌশলটি এই কোডের চেয়ে 38% দ্রুত চলে। (আমি আপনার মুদ্রণ বক্তব্য outputlist.append কল দিয়ে প্রতিস্থাপিত)
Deestan

আমি 1 থেকে 100 এর মধ্যে 100000 এলোমেলো মানগুলির তালিকা আকারের সাথে কিছু পরীক্ষাও করেছি I আমি যে কোডটি লিখেছি তা কিছু ক্ষেত্রে দ্বিগুণ দ্রুত ছিল। কোনও সময় পরীক্ষার পোস্টারের অ্যাপ্লিকেশনের সাথে তুলনীয় নয় (অবশ্যই তাদের অবশ্যই নিশ্চিত হওয়ার জন্য তাদের পরীক্ষা করা উচিত)। আমার মতামত এই পোস্টের জন্য ক্ষতিকারক হলে আমি ক্ষমা চাইছি।

0

আমি মনে করি যে থেঙ্কটার লাইব্রেরি থেকে অভিশাপ () পদ্ধতিটি ব্যবহার করা কার্যকর হতে পারে:

from Tkinter import * 
listbox.curselection()

এই পদ্ধতিটি টিন্টার লিস্টবক্স উইজেটগুলিতে কাজ করে, সুতরাং আপনাকে তালিকার পরিবর্তে সেগুলির একটি তৈরি করতে হবে।

এটি এর মতো অবস্থান ফিরিয়ে দেবে:

('0',) (যদিও টিনেটারের পরবর্তী সংস্করণগুলি পরিবর্তে ইনটগুলির একটি তালিকা ফিরে আসতে পারে)

যা প্রথম পজিশনের জন্য এবং আইটেমের অবস্থান অনুযায়ী নম্বরটি পরিবর্তন হবে।

আরও তথ্যের জন্য, এই পৃষ্ঠাটি দেখুন: http://effbot.org/tkinterbook/listbox.htm

গ্রিটিংস।


1
আকর্ষণীয় ধারণা। যেহেতু এটির জন্য পুরো টিকিন্টার লাইব্রেরি আমদানি করা দরকার, যদিও সমস্যাটি সমাধান করার পক্ষে এটি সবচেয়ে কার্যকর উপায় নয়।
সমুদ্র সৈকত

3
এটি এমন একটি অদক্ষ এবং জালিয়াতিপূর্ণ পথ যা আমি বলব এটি একটি ভুল উত্তর, এমনকি যদি এটি কিছুটা প্রশ্নের সমাধান করে।

এই প্রশ্নের প্রশ্নের সাথে কোনও সম্পর্ক নেই।
কোডি পিয়ার্সাল

0

জটিল জিনিস কেন?

testlist = [1,2,3,5,3,1,2,1,6]
for position, item in enumerate(testlist):
    if item == 1:
        print position

0

কেবলমাত্র input_listযা searies1(উদাহরণস্বরূপ: ইনপুট_লিস্ট [0]) এর সাথে আপনি series2উদাহরণ (উদাহরণ: ইনপুট_লিস্ট [1]) দেখতে চান এবং সেই সাথে সিরিজ 1 তে উপস্থিত থাকলে সিরিজ 2 এর সূচিপত্রগুলি সহ সম্পূর্ণ উদাহরণটি চিত্রিত করতে পারেন।

দ্রষ্টব্য: 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]

-2
testlist = [1,2,3,5,3,1,2,1,6]
for id, value in enumerate(testlist):
    if id == 1:
        print testlist[id]

আমি অনুমান করি যে এটি আপনি যা চান তা নিখুঁতভাবে। ;-) 'আইডি' সর্বদা তালিকার মানগুলির সূচক হবে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.