2012-01-14 8 views
22

私はJavaでこれを行う方法の一般的な考え方を持っていますが、私はPythonを学習しています。最初の要素の後に他のすべての要素をスキップします。

最初の要素から始まるリストの他のすべての要素を含むリストを返す関数を実装する必要があります。

これまでのところ、私が持っていると私はforループのPythonで異なる方法を学んでおりますので、ここから行う方法がわからない:

def altElement(a): 
    b = [] 
    for i in a: 
     b.append(a) 

    print b 

答えて

41
def altElement(a): 
    return a[::2] 
34

スライス表記

start_indexa[start_index:end_index:step]

return a[::2] 
既定値は 0で、 end_indexの既定値は len(a)です。

2
b = a[::2] 

これはextended slice syntaxを使用します。あなたが持っているようforループの使用

0

、一つの方法はこれです:

def altElement(a): 
    b = [] 
    j = False 
    for i in a: 
     j = not j 
     if j: 
      b.append(i) 

    print b 

jはちょうどbに要素を追加するときを追跡するために、0と1の間の切り替え続けます。また

+0

なぜあなたは単にトグルとしてブール値を使用していませんか?また、これは言い切れないほど一義的です。 –

+1

私はこの方法で作者の試みを反映させました。はい、非常にPythonのようなものではありません。確かに、私は喜んで編集し、それをブールにするでしょう... – bchurchill

+0

これはあなたがリストスライスを使用できると考えると、実際には貧弱なアプローチです。 – jdi

1
items = range(10) 
print items 
>>> [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 
print items[1::2] # every other item after the second; slight variation 
>>> [1, 3, 5, 7, 9] 
] 
5

、あなたができる:

for i in range(0, len(a), 2): 
    #do something 

を拡張スライス表記は、しかし、はるかに簡潔です。

+0

これは私には役に立ちましたが、拡張スライス表記法とは違って、元の配列に到達できるインデックスを与える点で異なります、 "フィルタリングされた"配列を得る代わりに。だから彼らはさまざまなユースケースを持っています。 –

2

猫を肌にする1つ以上の方法があります。 - セバ・スミス

arr = list(range(10)) # Range from 0-9 

# List comprehension: Range with conditional 
print [arr[index] for index in range(len(arr)) if index % 2 == 0] 

# List comprehension: Range with step 
print [arr[index] for index in range(0, len(arr), 2)] 

# List comprehension: Enumerate with conditional 
print [item for index, item in enumerate(arr) if index % 2 == 0] 

# List filter: Index in range 
print filter(lambda index: index % 2 == 0, range(len(arr))) 

# Extended slice 
print arr[::2] 
関連する問題