0

こんにちは!

そのため、2 つのリストから要素を取得する関数があります。1 つ目は標準のリスト形式で、2 つ目はリストのリストで、内側のリストには 3 タプルの形式の要素が含まれています。私の出力は、2 番目のリストの形式の新しいリストであり、同じ数の内部リストに同じ数の要素を含み、関数を通過した結果として値の一部がわずかに調整されています。

これはコードの例と関数の例で、チェーンが itertools からインポートされています。最初は次のようなリスト[0,1,2,3,1,5,6,7,1,2,3,5,1,1,2,3,5,6]ですが、2番目は次のようなリストです[[(13,12,32),(11,444,25)],[(312,443,12),(123,4,123)],[(545,541,1),(561,112,560)]]

def add(x, y):
    return x + y 

foo = [add(x, y) for x, y in zip(first, chain(*(chain(*second))))]
bar = [foo[i:i+3] for i in range(0, len(foo), 3)]
second = [bar[i:i+2]  for i in range(0, len(foo) / 3, 2)]

* *注: Chain(chain()) 部分は次の目的のためのものです: 通常、3 タプルを含むリストのリストを処理するのは少し難しいため、chain(chain()) は単純に (従来のリストに) 平坦化されます。個々の要素の) 前述の「奇数形式」の 2 番目のリスト。コードの残りの部分は、関数の出力から新しいリストを元の形式に再構築するだけです。これは既にフラット化された形式になっています。

私が抱えている問題は次のとおりです。

出力を元の「2番目の」リストとまったく同じサイズと形式にしたい。両方のリストが空の場合、空のリストが返されるようにします。最初のリストが空の場合、元の 2 番目のリストが返されるようにします。2 番目のリストが空の場合、空のリストが返されるようにします。

最初のリストが2番目のリストよりも短い場合、関数を実行したいのですが、2つのリスト間で要素を一致させることができ、2番目のリストの「超過」は変更されません。

2 番目のリストが最初のリストよりも短い場合、2 番目のリストにある多くの要素に対して関数を実行し、リスト 1 の「余分な」要素を無視して、同じ値を持つ新しいリストを出力します。元の 2 番目のリストとしての寸法と書式設定。

私の問題は、これらの小さなニュアンスをコードに実装する方法がわからないことです。どんな助けでも大歓迎です。

乾杯、ジェームズ

4

3 に答える 3

0

最初のリストに十分な長さがない場合は None を埋め込み、長すぎる場合は削除してください。

次に、x が None でない関数のみを実行します。それ以外の場合は y を返します。

私は例をコーディングしようとしました

from itertools import chain

first = [0, 1, 2, 3, 1, 5, 6, 7, 1, 2, 3, 5, 1, 1, 2, 3, 5, 6]
second = [
    [(13, 12, 32), (11, 444, 25)],
    [(312, 443, 12), (123, 4, 123)],
    [(545, 541, 1), (561, 112, 560)],
    [(13, 12, 32), (11, 444, 25)],
    [(312, 443, 12), (123, 4, 123)],
    [(545, 541, 1), (561, 112, 560)],
]

def add(x, y):
    return x + y 


def pad(list,length):
    for i in range(length-len(list)):
        list.append(None)
    return list[0:length]


first = pad(first,len(list(chain(*(chain(*second))) )))
# There is probably a better way to achieve this
foo = [add(x, y) if x else y for x, y in zip(first, chain(*(chain(*second))))]
bar = [foo[i:i+3] for i in range(0, len(foo), 3)]
second = [bar[i:i+2]  for i in range(0, len(foo) / 3, 2)]
print second
于 2013-10-01T14:46:10.617 に答える