2009-05-27 11 views
98

मैं प्रत्येक आइटम को उसके बाद एक के विरुद्ध जांचने वाली सूची के माध्यम से लूप करना चाहता हूं।सूची के आखिरी आइटम के अलावा सभी के माध्यम से कैसे लूप करें?

क्या कोई तरीका है कि मैं सभी में लूप कर सकता हूं लेकिन अंतिम आइटम x में x के लिए उपयोग कर रहा हूं? अगर मैं कर सकता हूं तो मैं इंडेक्स का उपयोग किए बिना ऐसा करना पसंद करूंगा।

नोट

freespace मेरे वास्तविक सवाल है, यही वजह है कि मैं इस सवाल का जवाब स्वीकार किए जाते हैं उत्तर दिया, लेकिन SilentGhost सवाल मैंने पूछा जाना चाहिए था जवाब दे दिया।

भ्रम के लिए क्षमा।

उत्तर

196
for x in y[:-1] 

तो y एक जनरेटर है, तो ऊपर काम नहीं करेगा।

+0

यह मेरे प्रश्न का उत्तर देता है, धन्यवाद, लेकिन मैं यह पूछना भूल गया कि मैं x के बाद आइटम कैसे प्राप्त करूंगा। क्या यह संभव है? –

+0

मेरा मानना ​​है कि एक "अन्य" कथन आपको लूप के बाद क्या होता है इसे संभालने की अनुमति देगा, बस अंतिम तत्व में x सेट करना न भूलें। – nevets1219

+2

- 1 मुझे नहीं लगता कि सवाल का जवाब दें। यह प्रत्येक आइटम की तुलना अगले के साथ नहीं कर रहा है। - odwl 0 सेकंड पहले – odwl

18

यदि आप अनुक्रम युग्म में सभी तत्वों को प्राप्त करना चाहते हैं, तो इस दृष्टिकोण का उपयोग करें (pairwise फ़ंक्शन itertools मॉड्यूल में उदाहरणों से है)।

from itertools import tee, izip, chain 

def pairwise(seq): 
    a,b = tee(seq) 
    b.next() 
    return izip(a,b) 

for current_item, next_item in pairwise(y): 
    if compare(current_item, next_item): 
     # do what you have to do 

आप कुछ विशेष मूल्य, चेन आप सूची आप कर सकते थे में n + 1 वें आइटम के साथ n वें आइटम की तुलना का मतलब है कि अंत

for current, next_item in pairwise(chain(y, [None])): 
+0

कृपया ध्यान दें कि – SilentGhost

+0

में निर्मित परिवर्तनीय नाम छाया के लिए अगला उपयोग, जब मैं चर का दायरा छोटा होता है और नाम पठनीयता के लिए अच्छा होता है तो मैं व्यक्तिगत रूप से कम उपयोग किए गए बिल्टिन को छायांकित नहीं करता हूं। फिर भी अच्छे कोडिंग प्रथाओं को बनाए रखने के लिए चर नामों को संपादित किया। –

4

के मूल्य पिछले मूल्य की तुलना करने की जरूरत है

>>> for i in range(len(list[:-1])): 
...  print list[i]>list[i+1] 

नोट पर भी कोई हार्ड कोडिंग नहीं चल रही है। यह तब तक ठीक होना चाहिए जब तक कि आप अन्यथा महसूस न करें।

+2

आप सूची प्रतिलिपि से बचने के लिए लेन (सूची) - 1 के साथ लेन (सूची [: - 1]) को प्रतिस्थापित कर सकते हैं। और एक चर नामक सूची का उपयोग करने से बचें ... –

37

निम्नलिखित के साथ अनुक्रम आइटम की तुलना करने के लिए सबसे आसान तरीका:

for i, j in zip(a, a[1:]): 
    # compare i (the current) to j (the following) 
+9

यह सवाल मैं चाहता हूं कि मैंने पूछा था। धन्यवाद –

+2

दरअसल, आप पहले स्लाइस को छोड़ सकते हैं, क्योंकि ज़िप लंबी लंबाई की लंबी सूची को छोटा कर देता है। यह आपको एक सूची निर्माण बचाएगा। (बस अगर आप बड़ी सूचियों से निपट रहे हैं। लेकिन उस स्थिति में, आपको चींट्स एजामा के दृष्टिकोण का पालन करना चाहिए, जो कुछ भी कॉपी नहीं करता है।) – bayer

+0

धन्यवाद, आमतौर पर, यह वास्तव में क्लीनर दिखता है। – SilentGhost

0

एक सूची instantiating बिना पुनरावर्तक में अगले एक के साथ प्रत्येक मद की तुलना करना:

import itertools 
it = (x for x in range(10)) 
data1, data2 = itertools.tee(it) 
data2.next() 
for a, b in itertools.izip(data1, data2): 
    print a, b 
+1

एंट्स एजामा द्वारा बिल्कुल सुझाया गया था http://stackoverflow.com/questions/914715/python-looping-through-all-but-the-last-item-of-a-list/914786#914786 – SilentGhost

0

यह वही उत्तर देता है OP को से पूछा जाना चाहिए, यानी लगातार तत्वों (उत्कृष्ट SilentGhost उत्तर) की तुलना में एक सूची को पार करें, फिर भी किसी भी समूह (एन-ग्राम) के लिए सामान्यीकृत: 2, 3, ... n:

zip(*(l[start:] for start in range(0, n)))

उदाहरण:

l = range(0, 4) # [0, 1, 2, 3] 

list(zip(*(l[start:] for start in range(0, 2)))) # == [(0, 1), (1, 2), (2, 3)] 
list(zip(*(l[start:] for start in range(0, 3)))) # == [(0, 1, 2), (1, 2, 3)] 
list(zip(*(l[start:] for start in range(0, 4)))) # == [(0, 1, 2, 3)] 
list(zip(*(l[start:] for start in range(0, 5)))) # == [] 

स्पष्टीकरण:

  • l[start:] सूचकांक start
  • *list या *generator से शुरू आ सूची/जनरेटर उत्पन्न करता है: सब गुजरता ELEM संलग्नित समारोह zip के पिता के रूप में अगर यह लिखा गया था zip(elem1, elem2, ...)

नोट:

AFAIK, इस कोड के रूप में आलसी के रूप में यह हो सकता है। टेस्ट नहीं हुआ।

संबंधित मुद्दे