पायथन सूची समझ में आइटम सूचकांक तक पहुंच संभव है?


90

निम्नलिखित पायथन कोड पर विचार करें जिसके साथ मैं list21 से 3 के सूचकांकों के साथ एक नया सभी आइटम जोड़ता हूं list1:

for ind, obj in enumerate(list1):
    if 4 > ind > 0:
        list2.append(obj)

सूची बोध का उपयोग करके आप इसे कैसे लिखेंगे, अगर मेरे पास गणना के माध्यम से सूचकांकों तक पहुंच नहीं है?

कुछ इस तरह:

list2 = [x for x in list1 if 4 > ind > 0]

लेकिन चूंकि मेरे पास कोई indसंख्या नहीं है , क्या यह काम करेगा?

list2 = [x for x in enumerate(list1) if 4 > ind > 0]

3
मुझे लगता है कि आपका वास्तविक उपयोग मामला अधिक जटिल है, लेकिन आप बस list1[1:4]यहाँ स्लाइसिंग कर सकते हैं
23:13 पर

आप का मतलब है कि मैं सूची समझ के अंदर सूची का टुकड़ा कर सकता था? जैसे [x for x in list1[1:4]]:?
Pav Ametvic

@PavAmetvic, नहीं @wim का मतलब है कि आप सिर्फ लिख सकते हैंlist2 = list1[1:4]
जॉन ला रोय

जवाबों:



37

यदि आप उपयोग करते हैं enumerate, तो आपके पास सूचकांक तक पहुंच है:

list2 = [x for ind, x in enumerate(list1) if 4>ind>0]

10

जब तक आपका वास्तविक उपयोग मामला अधिक जटिल नहीं है, तब तक आपको @wim द्वारा सुझाई गई सूची का उपयोग करना चाहिए

>>> list1 = ['zero', 'one', 'two', 'three', 'four', 'five', 'six']
>>> [x for ind, x in enumerate(list1) if 4 > ind > 0]
['one', 'two', 'three']
>>> list1[1:4]
['one', 'two', 'three']

अधिक जटिल मामलों के लिए - यदि आपको वास्तव में सूचकांक की आवश्यकता नहीं है - यह एक स्लाइस या एक आइलिस पर पुनरावृति करने के लिए स्पष्ट है

list2 = [x*2 for x in list1[1:4]]

या

from itertools import islice
list2 = [x*2 for x in islice(list1, 1, 4)]

छोटे स्लाइस के लिए, सरल list1[1:4]। यदि स्लाइस काफी बड़ी हो सकती है, तो मेमोरी को कॉपी करने से बचने के लिए एक आईलिस का उपयोग करना बेहतर हो सकता है


धन्यवाद, लेकिन चूंकि मैं नई सूची के अंदर संग्रहीत करने से पहले समझ के अंदर 'x' पर एक ऑपरेशन करना चाहता हूं (x * x कहता है), ऐसा लगता है कि सूची समझ के अंदर स्लाइस का उपयोग करना सबसे अच्छा तरीका है! धन्यवाद
पाव एमेटविक

@PavAmetvic, ठीक है उन मामलों में अभी भी पर्याप्त है कि उन्हें एन्यूमरेशन की ज़रूरत नहीं है
जॉन ला रोय
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.