短縮版:
私は拡張スライシングについて読んだばかりで、スライスのタプルをに渡すことができることを学びました__getitem__
:
a[::3, 1::3]
それにもかかわらず、スライスを任意の関数に渡すことはできません (間違っている場合は修正してください)。したがって、これは失敗します。
f(::3, 1::3)
やや面倒な回避策は次の呼び出しslice
です。
f(slice(None, None, 3), slice(1, None, 3))
[]
1.リスト、{}
辞書とセット、または()
ジェネレータとタプルのようなスライス リテラル (内包表記) はありますか? (たぶん<start, end, step>
、または何でも)
2. きちんとしたスライス表記で任意の関数にスライスを渡すことは可能ですか?
長いバージョン (TL;DR):
リストの異なるスライスを合体させたい場合、つまり に評価されないこれらのスライスの最初の要素を見つけFalse
たい場合、よく知られている非常に簡潔なスライス表記をこの関数に渡すことができればよいでしょう。解決策は次のようになりますが、これが賢明でないかどうかはわかりません。
#! /usr/bin/python3.3
class Array(list):
class Coalescer:
def __init__(self, array):
self.array = array
def __getitem__(self, slices):
if not isinstance(slices, tuple):
slices = (slices,)
for s in slices:
for e in self.array[s]:
if e: return e
return None
@property
def coalesce(self):
return Array.Coalescer(self)
a = Array ([0, 0, 2, 0, 3, 4, 0, 5, 6])
print(a.coalesce[:]) #2
print(a.coalesce[::3]) #None
print(a.coalesce[1::3]) #3
print(a.coalesce[::3, 1::3]) #3
a [6] = 42
print(a.coalesce[::3, 1::3]) #42
a.coalesce(slice(None, None, 3), slice(1, None, 3))
私見、これはまたはよりも読みやすいですcoalesce(a, slice(None, None, 3), slice(1, None, 3))
。
3.これは実行可能なオプションですか、それとも使用しない方法の悪い例__getitem__
ですか?
__getitem__
4.いつ、どのように上書きするか、さらに重要なことに、いつ、どのように上書きしないかについてのガイドラインを提供するPEPまたはその他のドキュメントはありますか?
5. あなたの推定では、スライスの順序付けられたリストを結合する関数を実装する最も適切な方法はどれですか?
どうもありがとうございました。