質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

6回答

336閲覧

x個ずつリストの先頭に値を追加したい

ruto_07

総合スコア6

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

1グッド

0クリップ

投稿2020/03/31 07:25

編集2020/03/31 07:33

以下のように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の倍数ですので、必ず割り切れます。

teamikl👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

suomo

2020/03/31 07:29

3つずつ、というのは、今回の場合6要素のリストAに紐づけたいリストBが2要素しかないので、6/2=3で結果的に3要素ずつなのか、 それとも3要素は絶対に守りたい条件なのかどちらでしょうか? (今回は割り切れるので問題ありませんが、例えばリストAが7要素でリストBが2要素のときに、前半4つと後半3つに分割するのか、あるいは3個ずつつけていって余ったリストAの最後の1要素には、最初からループしてまたリストBの1要素目をつけたいのか、といった違いが生じるためです。明確にされたほうが的確な回答が得られると思います。)
guest

回答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
teamikl

総合スコア8664

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

jun68ykt

2020/03/31 09:11

「その手があったか!」という感じです。質問を見て「まずは listAを chunk だな」と(先入観で)思い込んでしまうと、これはなかなか思いつきません。
ruto_07

2020/03/31 09:12

リスト内包表記が分かりやすく、こちらで実装させていただきたいと思います。 ご回答ありがとうございました。
teamikl

2020/03/31 10:10 編集

>jun68yktさん いろいろな方法があるのはわかっていましたが、 実際にどういう過程で書かれたコードなのか、考えてみて興味深かったです。 問題の A の要素3つに対して B をそれぞれ~ を文面通り忠実にコードに落とすなら、確かにlistAを分割は自然な流れですね。 組み合わせ=>zip, 繰り返し=>repeat を漠然とイメージしていて、 zipを利用するにあたり、リストの長さを揃えるのを考えました。 chunkは寧ろ listA, listB の構築に。 itertoolsをアピールしたくて書いたコードが、 整理してると不要になったのは自分でも意外でした:)
guest

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

投稿2020/03/31 08:07

jun68ykt

総合スコア9058

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ruto_07

2020/03/31 09:14

いただいたご回答も参考になりましたが、もっと簡単に実現できる方法がありましたので、そちらで実装したいも思います。 ご回答ありがとうございました。
jun68ykt

2020/03/31 09:19

どういたしまして。teamiklさんのベストアンサーのほうにもコメントしましたが、listB の要素を3個ずつにするというアプローチは思いつきもしませんでした。興味深いご質問、ありがとうございました。
guest

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

suomo

総合スコア82

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ruto_07

2020/03/31 09:15

いただいたご回答も参考になりましたが、簡単に実現できる方法がありましたので、そちらで実装したいも思います。 chunkedというメソッドはまた別の機会に使ってみたいと思います。 ご回答ありがとうございました。
suomo

2020/04/01 07:56

せっかく追記依頼をお願いしておきながら、結局簡便な案を提示できませんでした。chunkedの便利なところは、余りがあってもいい感じにあまりを一つの要素として残してくれるところです。(例えば8要素のリストAに対してchunked(listA, 3)とすると、3+3+2に分けてくれます) 使いどころがありましたら是非に。
guest

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
teamikl

総合スコア8664

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

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

katoy

総合スコア22324

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

teamikl

2020/04/01 23:52

nice approach 可読性は少し落ちますが、enumerate でも行けますね listAを複数書きたくない&短縮で。 [listB[i//3]+a for i,a in enumerate(listA)]
katoy

2020/04/03 12:04

↑のコードは短くて良いですね。
guest

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

jeanbiego

総合スコア3966

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ruto_07

2020/03/31 09:15

いただいたご回答も参考になりましたが、もっと簡単に実現できる方法がありましたので、そちらで実装したいも思います。 ご回答ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問