2016-12-29 5 views
0

Ich bin ziemlich neu in Python (ich bin mehr an C, C#) gewöhnt. Ich versuche zu lernen, und ich möchte versuchen, Dinge wie 'Pythonic' wie möglich zu machen.Wie Iterate über Intervalle in Python ordnungsgemäß?

Ich möchte über Intervalle iterieren und dann etwas tun, basierend darauf, ob eine Zahl im Intervall ist oder nicht. Ich weiß, ich kann meine Intervalle mit numpy.arrange (oder einem anderen Array Defintion) erstellen und dann iterieren die Behälter wie so

ibins = numpy.arange(start = 19, stop = 67, step = 2) 
a = 50 
for idx, val in enumerate(ibins) : 
    if idx > 0: 
     if ibins[idx - 1] <= a < ibins[idx] : 
      #do something more meaningfull 
      print('Hello') 

jedoch auf verschiedenen Beiträgen lesen ist mein Verständnis, dass der Index des Zugriff auf bin Elemente wird in Python als "schlechte Form" betrachtet.

Was würde ich tun möchte, ist mehr so ​​etwas wie dies

for ibin in ibins 
    if a is in ibin #somehow determine if a is in the bin 
     print('Hello') 

Gibt es einen vernünftigen, kurzen Weg, dies zu erreichen? Oder ist mein erster Vorschlag der beste Weg zu gehen.

Ich möchte keine benutzerdefinierten Intervall-Objekte oder Dinge dieser Art erstellen.

+1

'bin' ein Schlüsselwort in Python ist! Versuchen Sie, Schlüsselwörter als Variablennamen zu vermeiden. –

+0

@hiroprotagonist Danke. Ich habe meinen Beitrag entsprechend deinem Kommentar bearbeitet. – mortysporty

Antwort

1
start = 19 
stop = 67 
step = 2 

for bin in [range(i, i+step) for i in range(start, stop, step)]: 
    if a in bin: 
     print('Hello') 

Wenn Sie mit Python 2, dann xrange Methode ist besser als Bereich.

+0

du meintest 'wenn ein in bin '? (SO nicht bearbeiten von weniger als 6 Zeichen daher kommentieren statt direkt bearbeiten) – Anupam

+0

@AnupamJain Yeah –

+1

Ja ... das ist, was ich will :) Danke! – mortysporty

1

gibt es eine Diskussion dieser hier: Iteration over list slices

dies ist eine der kürzesten Versionen:

import numpy as np 

lst = np.arange(start = 19, stop = 67, step = 2) 
bin_width = 5 
search = 50 

for ibin in zip(*(iter(lst),) * bin_width): 
    print(ibin) 
    if min(ibin) <= search <= max(ibin): 
     print('found!') 
    # or this? not sure what you want... 
    if ibin[0] <= search <= ibin[-1]: 
     print('found!') 

diese druckt

(19, 21, 23, 25, 27) 
(29, 31, 33, 35, 37) 
(39, 41, 43, 45, 47) 
(49, 51, 53, 55, 57) 
found! 
found!