2017-02-10 1 views
3

私にa = range(1,51)があるとします。どのように私は次のようになり、新しいリストを作成するaをスライスすることができますリスト/配列を定期的にスライスする

[1,2,3,11,12,13,21,22,23,31,32,33,41,42,43] 

ことは私が関数を記述することなく、これを行うことができます神託の方法はありますか?

私は、1つの要素を定期的にスライスしていることを知っていますが、わかりません。

編集:提案された重複質問/回答は私の質問と同じではありません。私は単純に大きなリスト/配列から要素をスライス/抽出するよう求めました。提案された複製は、既存の配列の要素を変更します。

+0

あなたはリスト内包に – Vinay

+0

感謝を使用する必要がリスト内包に適合させることができます。一定。それは脳のようなものでした。 – kabel

+0

[Pythonでスライスを使用して複数のナンシー配列要素を変更する]の可能な複製(http://stackoverflow.com/questions/42092657/changing-multiple-numpy-array-elements-using-slicing-in-python) –

答えて

3

別のオプション、のようなもの:

a[(a - 1) % 10 < 3] 
# array([ 1, 2, 3, 11, 12, 13, 21, 22, 23, 31, 32, 33, 41, 42, 43]) 

(a - 1) % 10は配列の残りを10(ピリオド)で求めます。 (a - 1) % 10 < 3は、10個の要素ごとに最初の3つの要素について真を与える論理ベクトルを与える。

+0

これはnumpy.arrayでのみ有効です。 Pythonのリストタイプはこれでは動作しません。 –

+0

@AlexFungが正しい。 OPにはnumpyというタグが付いているので、ここではnumpyの配列であると仮定します。 – Psidom

+0

注目。しかし、華麗でエレガントです...なぜ私はそれを考えなかったのですか? :0 :(:) – kabel

2

あなたが望むのは、単純なスライスよりも複雑なので、何らかの(かなり単純な)機能が必要になります。あなたが行うことができます

>>> li=range(1,52) 

考える

reduce(lambda a,b:a+b, map(list, zip(a[1::10], a[2::10], a[3::10])))

2

:私は、複数のスライス、のようなものを組み合わせることzipを使って見たい

>>> [l for sl in [li[i:i+3] for i in range(0,len(li),10)] for l in sl] 
[1, 2, 3, 11, 12, 13, 21, 22, 23, 31, 32, 33, 41, 42, 43, 51] 

それとも、あなただけしたい場合完全サブリスト:

>>> [l for sl in [li[i:i+3] for i in range(0,len(li),10)] for l in sl if len(sl)==3] 
[1, 2, 3, 11, 12, 13, 21, 22, 23, 31, 32, 33, 41, 42, 43] 

あるいは、与えられた:

>>> li=range(1,51) 

次にあなたがサブリストをテストする必要はありません:あなたは論理ベクトルのサブセットで行くことができ

>>> [l for sl in [li[i:i+3] for i in range(0,len(li),10)] for l in sl] 
[1, 2, 3, 11, 12, 13, 21, 22, 23, 31, 32, 33, 41, 42, 43] 
1

Psidomの答えのインデックス数学はあまりに

a = range(1,51) 

[n for n in a if (n - 1) % 10 < 3] 

Out[23]: [1, 2, 3, 11, 12, 13, 21, 22, 23, 31, 32, 33, 41, 42, 43] 
関連する問題