2017-11-07 11 views
0

私は条件付きロジックを以下に基づいて、Pythonのリストから値を抽出したい:エキス値

ll = [2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015] 

私は与えられた値の前後に3つの値を抽出したいです。例えば入力が2007の場合は、2004年、2005年、2006年およびそれ以降の3つの値は、2008年、2009年、2010年となります。入力が2014の場合は、前に5つの値を抽出し、 6つの値のうちの1つ)。

forループを使用してこれを行うことはできますが、もっとpythonicな解決策がありますか?

+0

はい、スライスを使用してこれを行うことができます。以下は参考になります:https://docs.python.org/2.3/whatsnew/section-slices.html これらのスライスの実際の値を計算する必要があります。あなたが言ったように、あなたは常に6つのリスト項目が必要です。しかし、それがリストの最後にある場合、あなたはラップアラウンドしたくありません。 –

+0

@CarlesMitjans、はいそれは常に注文され、ステップサイズは1と仮定できます – user308827

答えて

0

使用スライシング:ダニエルが言及したよう

>>> ll = [2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015] 
>>> idx = ll.index(2002) 
>>> ll[max(idx-5,0):idx+2] 
[2001, 2002, 2003] 
>>> idx = ll.index(2013) 
>>> ll[max(idx-5,0):idx+2] 
[2008, 2009, 2010, 2011, 2012, 2013, 2014] 
1

リスト・スライシングは、このためだけに作られています。あなたが求めているのは標準的なユースケースではないので、あなた自身の関数を書く必要があります。私はそれを行うための2つの方法を見つけました。

5つの可能なケースを簡単に区別してリストスライスを適用します。ここのif-seriesは、return文が関数を終了するためにのみ機能します。これは基本的にif-elseと同じです。

ll.remove()をスマートに使用すると、2行目のコードの行数が少なくなりますが、理解するのは少し難解です。

いずれかが動作します。

ll = [2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 
     2011, 2012, 2013, 2014, 2015] 

def six_neighbours_simple(year): 
    idx = ll.index(year) # get location of year in array 
    # take care of the left end 
    if idx == 0: 
     return ll[1:7] 
    if idx < 3: 
     return ll[:idx] + ll[idx+1:7] 
    # take care of the right end 
    if idx == len(ll) - 1: 
     return ll[-7:-1] 
    if idx > len(ll) - 4: 
     return ll[-7:idx] + ll[idx+1:] 
    # ELSE 
    return ll[idx-3:idx] + ll[idx+1:idx+4] 

def six_neighbours_short(yr): 
    idx = ll.index(yr) # save location of yr 
    years = ll[:] # copy list into new variable so we don't change it 
    years.remove(yr) # remove selected year 
    left_slice = idx-3 # start of range 
    left_slice = min(max(0,left_slice),len(years)-6) # account for edges 
    right_slice = left_slice+6 # end of range is straightforward now 
    return years[left_slice:right_slice]