以下のようにlistAとlistBを結合してlistCを作成したいのですが、良い案が浮かばず、ご教授いただきたいです。
listA=[[A,B],[C,D],[E,F],[G,H],[I,J],[K,L]] listB=[[あ,い],[う,え]] listC=[[あ,い,A,B],[あ,い,C,D],[あ,い,E,F],[う,え,G,H],[う,え,I,J],[う,え,K,L]]
listAのリスト3つずつに対して、listBをそれぞれ結合するような感じです。
listAとlistBで多重ループをして実現しようとしましたが、うまくいかず、本来[あ,い]を付与したくない[G,H]にも[あ,い]が付与されてしまい上手くいきません。
是非ご教授いただけませんでしょうか。
よろしくお願いします。
追記
listAの要素数は今回6要素ですが都度変わります。ただ、変わったとしても3の倍数ですので、必ず割り切れます。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答6件
0
ベストアンサー
複雑な事しなくても良かった。
listBの各要素を3回繰り返すリストを作り、
zipでlistAと掛け合わせます。
python
1listA = [["A","B"],["C","D"],["E","F"],["G","H"],["I","J"],["K","L"]] 2listB = [["あ","い"],["う","え"]] 3listC = [b + a for a, b in zip(listA, (b for b in listB for _ in range(3)))] 4 5# for a,b in zip(listA, (b for b in listB for _ in range(3)): 6# print(b + a)
※リスト内包表記に変更。元のコードはコメントアウト。
投稿2020/03/31 08:44
編集2020/03/31 09:02総合スコア8760
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/03/31 09:11
2020/03/31 09:12
2020/03/31 10:10 編集
0
こんにちは
面白い問題なので参加します。(chunkは、stackoverflow の回答を拝借しました。)
python
1# FYI: https://stackoverflow.com/a/312464 2def chunks(lst, n): 3 """Yield successive n-sized chunks from lst.""" 4 for i in range(0, len(lst), n): 5 yield lst[i:i + n] 6 7 8if __name__=='__main__': 9 10 listA = [['A','B'],['C','D'],['E','F'],['G','H'],['I','J'],['K','L']] 11 listB = [['あ','い'],['う','え']] 12 13 chunked_list = list(chunks(listA, 3)) # => [[['A', 'B'], ['C', 'D'], ['E', 'F']], [['G', 'H'], ['I', 'J'], ['K', 'L']]] 14 15 ziped_itr = zip(listB, chunked_list) # => [(['あ', 'い'], [['A', 'B'], ['C', 'D'], ['E', 'F']]), (['う', 'え'], [['G', 'H'], ['I', 'J'], ['K', 'L']])] 16 17 result = [[[*x[0], *y] for y in x[1]] for x in ziped_itr] # => [[['あ', 'い', 'A', 'B'], ['あ', 'い', 'C', 'D'], ['あ', 'い', 'E', 'F']], [['う', 'え', 'G', 'H'], ['う', 'え', 'I', 'J'], ['う', 'え', 'K', 'L']]] 18 19 result = sum(result, []) 20 21 print(result) # => [['あ', 'い', 'A', 'B'], ['あ', 'い', 'C', 'D'], ['あ', 'い', 'E', 'F'], ['う', 'え', 'G', 'H'], ['う', 'え', 'I', 'J'], ['う', 'え', 'K', 'L']] 22 23
- 動作確認用 Repl.it: https://repl.it/@jun68ykt/Q250503
投稿2020/03/31 08:07
総合スコア9058
0
more-itertoolsというライブラリにchunkedというメソッドがあります。これは与えたリストから指定の個数ずつまとめて取り出してくれるというものです。
例えば、
py
1from mote-itertools import chunked 2 3for chunk in chunked(listA, 3): 4 ...
とすると、一回目のループでchunkとして[[A,B],[C,D],[E,F]]が取り出され、二回目のループで残りの3つ[[G,H],[I,J],[K,L]]が取り出されます。
今回の場合、リストBの要素数はリストAに併せて増減する想定だと思いますので、以下のようなコードでいかがでしょうか。
py
1from mote-itertools import chunked 2 3listC = [] 4for as, b in zip(chunked(listA, 3), listB): 5 new_as = [b + elm for elm in as] #asの各要素の先頭にbを付け足したリストを新たに作る 6 listC.extend(new_as) #listCに上の行で作ったリストを順に連結していく 7 8print(listC)
投稿2020/03/31 07:51
総合スコア82
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/03/31 09:15
2020/04/01 07:56
0
追記: よりシンプルに書けたので別回答で投稿します
シンプルに、Bの要素を3回回し、Aを一個ずつ読み出し
iter()化してnext()で読みだすところがポイント。
python
1listA = [["A","B"],["C","D"],["E","F"],["G","H"],["I","J"],["K","L"]] 2listB = [["あ","い"],["う","え"]] 3listC = [] 4 5 6iterA = iter(listA) 7for b in listB: 8 for _ in range(3): 9 a = next(iterA) 10 listC.append(b + a) 11 12from pprint import pprint 13pprint(listC) 14
itertools 使った方法(関数プログラミングとか好きな人向け
説明追記:
listB の要素に対して、repeatで3回繰り返したリストを作り
chain.from_iterable で一段階フラットにします。
[["あ", "い"], ["あ", "い"], ["あ", "い"], ["う", "え"], ["う", "え"], ["う", "え"]]
と、listA と同じ長さのリストになるので、zipで掛け合わせます。
python
1from itertools import chain, repeat 2 3def chunk(size, seq): 4 return list(zip(*[iter(seq)]*size)) 5 6listA = list(map(list, chunk(2, "ABCDEFGHIJKL"))) 7listB = list(map(list, chunk(2, "あいうえ"))) # [["あ", "い"], ["う", "え"]] を生成 8 9def genListC(listA, listB): 10 for a, b in zip(listA, chain.from_iterable(repeat(b,3) for b in listB)): 11 yield b + a 12 13listC = list(genListC(listA, listB)) 14 15from pprint import pprint 16pprint(listC)
追記: ※ listをたくさん使ってますが、元のデータに合わせる為にいれただけなので、
最後以外はなくてもロジック自体は動きます。
投稿2020/03/31 07:56
編集2020/03/31 08:50総合スコア8760
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
python3
1listA = [["A", "B"], ["C", "D"], ["E", "F"], ["G", "H"], ["I", "J"], ["K", "L"]] 2listB = [["あ", "い"], ["う", "え"]] 3 4ans = [listB[(i // 3)] + listA[i] for i in range(len(listA))] 5print(ans) 6print() 7 8listA = [ 9 ["A", "B"], ["C", "D"], ["E", "F"], ["G", "H"], ["I", "J"], ["K", "L"], 10 ["a", "b"], ["c", "d"], ["e", "f"], ["g", "h"], ["i", "j"], ["k", "l"] 11] 12ans = [listB[(i // 3) % len(listB)] + listA[i] for i in range(len(listA))] 13print(ans)
投稿2020/04/01 23:25
総合スコア22324
0
3個ずつというと、下記のような格好でしょうか。
python3
1listA=[["A","B"],["C","D"],["E","F"],["G","H"],["I","J"],["K","L"]] 2listB=[["あ","い"],["う","え"]] 3 4listC = [] 5l = len(listA)/3 6for a in range(len(listA)): 7 listC.append(listB[int(a/3)]+listA[a]) 8print(listC)
[['あ', 'い', 'A', 'B'],
['あ', 'い', 'C', 'D'],
['あ', 'い', 'E', 'F'],
['う', 'え', 'G', 'H'],
['う', 'え', 'I', 'J'],
['う', 'え', 'K', 'L']]
投稿2020/03/31 07:37
総合スコア3966
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。