2017-05-12 4 views
0

Mit Python 3.X habe ich eine Liste von Zahlen mit einem maximalen Index von 2880. Ich möchte einen beliebigen Index wählen (zB 1500) und einen "Radius" um den Index von zB 5 definieren. Also erzeuge ich einen Bereich von Indizes: 1495, 1496, 1497, 1498, 1499, 1500, 1501, 1502, 1503, 1504, 1505.Python kreisförmigen Bereich mit Mittelpunkt und Radius aus Liste

Um dies zu tun, würde ich folgende verwenden:

min = 0 
max = 2880 
center = 1500 
radius = 5 
r = range(center - radius, center + radius + 1) 
>> 1495, 1496, 1497, 1498, 1499, 1500, 1501, 1502, 1503, 1504, 1505 

Das Problem ist, was passiert, wenn ich das Zentrum als 2878 definieren? Ich will nicht 2873, 2874, 2875, 2876, 2877, 2878, 2879, 2880,2881, 2882 ...

Ich brauche 2873, 2874, 2875, 2876, 2877, 2878, 2879, 2880, 0, 1, 2

gibt es eine Funktion in Python gebaut 3, die ein Zentrum, Radius und Array ermöglicht es akzeptiert, dies zu tun? Etwas wie:

Antwort

6

Ich würde ein Listenverständnis verwenden, um den Job zu erledigen. Etwas wie:

r = [ i % (max + 1) for i in range(center - radius, center + radius + 1)] 

>>> max = 2880 
>>> center = 2878 
>>> radius = 5 
>>> [ i % (max + 1) for i in range(center - radius, center + radius + 1)] 
[2873, 2874, 2875, 2876, 2877, 2878, 2879, 2880, 0, 1, 2] 
+0

Mein Gott. Ein echtes Leben Genuis. Vielen Dank! – pookie

+0

Und ich schaue mir 'itertools.cycle' an, wenn es nur modulo brauchte. Nice – SiHa

2

Sie können ganz einfach einen Generator erstellen, dies zu tun. Sie können den Generator wie range verwenden.

def bounded_range(center, radius, highest): 
    mod = highest + 1 
    for i in range(center - radius, center + radius + 1): 
     yield i % mod 

lst = [] 
for i in bounded_range(1500, 5, 2880): 
    lst.append(i) 

print(lst) 
print(list(bounded_range(2878, 5, 2880))) 

Ausgang

[1495, 1496, 1497, 1498, 1499, 1500, 1501, 1502, 1503, 1504, 1505] 
[2873, 2874, 2875, 2876, 2877, 2878, 2879, 2880, 0, 1, 2] 

BTW, sollten Sie nicht min oder max als Variablennamen verwenden, da, dass die eingebaute in min und max Funktionen Schatten.

+0

Danke, richtige Antwort und guten Tipp. Aber AugBar ist zuerst da und mit einer sehr schönen Lösung. – pookie

+0

@pookie Sie sind die Pausen. ;) Wenn Sie tatsächlich eine Liste benötigen, können Sie auch AugBars List-Comp benutzen. Wenn Sie jedoch eine Funktion wünschen, die sich mehr wie "Bereich" verhält und nur Werte erstellt, die benötigt werden, dann ist ein Generator besser als eine Listenkomp. Natürlich, wenn Sie nur eine Handvoll Indizes benötigen, ist das keine große Sache. –

Verwandte Themen