2

2 つのリストを同時に反復処理したいと思います。

最初のリストは、要素の通常のリストです。

2 番目のリストは複数のリストを含むリストで、それぞれが実際には 3 タプルである要素を含んでいます。

2番目のリスト内のすべてのリストのすべての3タプルのすべての要素に対して何らかの機能を実行したい(それが理解できる場合)。この関数は最初のリストの要素に依存するため、すべてを順番に実行したいと考えています。

つまり[0,1,2,3,1,5,6,7,1,2,3,5,1,1,2,3,5,6]、最初のリストや[[(13,12,32),(11,444,25)],[(312,443,12),(123,4,123)],[(545,541,1),(561,112,560)]]2 番目のリストなどのリストがある場合、最初のリストの最初の要素と最初のタプルの最初の要素を含むような操作を実行したいと思います。 2 番目のリストの最初のリスト。最初のリストの n 番目の要素と、タプル bla bla の n 番目の要素を使用して、この操作を反復したいと思います

したがって、操作のためにどの要素が一緒に使用されるかを見ている場合:

  • 0 は 13 と一致します
  • 1 は 12 と一致します
  • 2 は 32 と一致します
  • 3 は 11 と一致します
  • 1 は 444 と一致します
  • 5 は 25 と一致します
  • 6 は 312 に合う

等々。

何が起こっているかというと、私の関数は 2 番目のリストから要素を取得し、リスト 1 からペアになった要素を取得し、これらのビットを何らかの方法で使用して、新しい値を出力して元の 2 番目のリストの対応物を置き換えます。次に、この関数を実行した後の2番目のリストである置換/新しい「2番目のリスト」を構築したい(上記の情報を使用する)

これが半まとまりであることを願って、私はできるだけ有益になるように努めました. ご不明な点はお問い合わせください。

乾杯、あなたが提供できる助けに感謝します!

編集:

リスト 1 とリスト 2 を取得してから、リスト 2 を平坦化したいと考えています。その後、何らかの関数を使用して、両方のリストを反復処理したいと考えています。次に、関数からの出力を使用する新しいリストを作成します。これは、平坦化された2番目のリストの「調整された」値になりますが、元の形式では、リストのリストのタプルです。

つまり、私の出力は次のようになります。

[[(13,13,32),(11,444,24)],[(313,443,12),(123,4,123)],[(546,542,1),(561,112,561)]]

私の関数を「通過」した結果、値の一部が少し変化するか、同じままです。

編集#2:

チェックマークの付いたソリューションは、この問題に何が必要であったかを正確に示しています!

編集#3:

一番上のソリューションに必要ないくつかの修正:
最初のリストが空の場合、出力が元の 2 番目のリストになるようにコードを修正するにはどうすればよいですか? 2 番目のリストが空の場合、出力は空のリストになります。また、len(list 1) > len(list 2) の場合、リスト 2 の最後まで反復し、リスト 1 の余分な部分を無視して、元のリスト 2 と同じ形式の新しいリストを出力します。 list 2) > len (list 1) の場合、リスト 1 が一致する場所を反復処理しますが、リスト 2 の残りの部分は切り落とすのではなくそのまま残します。

if/elseif/else ループでこれらすべての修正を実行できますか?

編集:私はまだこれらの問題を修正しようとしていますが、これらの問題は分離/別のクエリになる可能性があります。誰かが手助けに興味がある場合は、https: //stackoverflow.com/questions/19118641/make-a-function-only-run-for-certain-conditions-in-python で新しい質問を投げかけました。

4

5 に答える 5

4

zip次のitertools.chainように使用できます。

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)]
]    
zip(first, chain(*(chain(*second))))

アップデート

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

# Flatten the second list
second_flattened = list(chain(*(chain(*second))))

# There is probably a better way to achieve this
foo = [add(x, y) for x, y in zip(first, second_flattened)]

# If second is longer we should append unprocessed values
if len(second_flattened) > len(first):
    foo += second_flattened[len(foo): ]

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)]
于 2013-10-01T12:41:30.940 に答える
1

2 番目のリストは、次の 2 つのレベルでフラット化する必要があります。

import itertools
flatten = itertools.chain.from_iterable
for i, j in zip(list1, flatten(flatten(list2))):
    # whatever
于 2013-10-01T12:54:35.723 に答える
0

python のitertoolscontainsizipを使用すると、zip と同じ構文を使用して、任意の数のリストを圧縮できます。すなわちizip(l1, l2, l3)

于 2014-08-18T03:34:25.620 に答える
0

これを行う。

dict(zip(ListA, eval('[' + repr(ListB).replace('(', '').replace(')', \
'').replace('[', '').replace('[', '') + ']'))

かなり長いことはわかっていますが、必要な出力を含む辞書が返されます。

于 2015-08-17T16:23:03.273 に答える
0

次のようなものを使用して、2 番目のリストから各要素を取得できます。

from itertools import chain
l=list(chain.from_iterable(list2))
于 2013-10-01T12:49:26.190 に答える