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

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

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

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

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

446閲覧

リストシャッフル後0番目の値の連続重複回避方法について

yuum

総合スコア17

Python 3.x

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

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2018/06/18 07:41

リストをランダムにシャッフル後各リストの最初の値(0番目)が連続で同じものにならないコードを作成したいのですができません。教えてもらえると助かります。

python

1import random 2 3li = {'a':16,'b':29,'c':35,'d':55,'e':57,'n':70,'o':72,'p':101,'q':103} 4 5n = int(input()) 6 7for num in range(n): 8 9 def shuffleDict(d): 10 keys = list(d.keys()) 11 random.shuffle(keys) 12 [(key, d[key]) for key in keys] 13 random.shuffle(keys) 14 keys = [(key, d[key]) for key in keys] 15 return dict(keys) 16 17 num_list = list(shuffleDict(li).keys()) 18 19 def first_key(num): 20 return num_list[0] 21 22 zf = num_list[:2] 23 24 if first_key(num) == first_key(num+1): 25 26 def re_shuffleDict(d): 27 keys = list(d.keys()) 28 random.shuffle(keys) 29 [(key, d[key]) for key in keys] 30 random.shuffle(keys) 31 keys = [(key, d[key]) for key in keys] 32 return dict(keys) 33 34 re_num_list = list(re_shuffleDict(li).keys()) 35 re_zf = re_num_list[:2] 36 37 print(re_zf) 38 39 else: 40 print(zf)

この結果n=2の時

['a', 'b']
['a', 'p']
となってしまいました...

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

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

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

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

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

guest

回答1

0

ベストアンサー

まず、Pythonの辞書は順序を保証しません。
ですので、順序を取り扱いたいときは辞書は用いてはなりません。

一度list(辞書.keys())を取得したら、それを使うようにしてください。


リストの第一要素を毎回変えたい場合、例えば次のような実装が考えられます。

Python

1import random 2 3 4def my_shuffle(src): 5 dst = src[:] 6 while True: 7 random.shuffle(dst) 8 9 if src[0] != dst[0]: 10 break 11 12 return dst 13 14 15def main(): 16 my_list = [1, 2, 3] 17 for _ in range(20): 18 my_list = my_shuffle(my_list) 19 print(my_list) 20 21 22if __name__ == '__main__': 23 main()

実行結果 Wandbox

[2, 1, 3] [3, 1, 2] [1, 3, 2] [3, 2, 1] [1, 3, 2] [2, 3, 1] [3, 2, 1] [2, 1, 3] [1, 3, 2] [2, 1, 3] [3, 2, 1] [2, 1, 3] [3, 1, 2] [1, 3, 2] [3, 2, 1] [2, 1, 3] [1, 3, 2] [3, 1, 2] [2, 3, 1] [3, 1, 2]

上記コードのmy_shuffleでは第一要素が変わるまで何回もシャッフルし続けています。

書いてみた

上記の点を踏まえると次のように書くことが出来ます。

Python

1import random 2 3 4def my_shuffle(src): 5 dst = src[:] 6 while True: 7 random.shuffle(dst) 8 9 if src[0] != dst[0]: 10 break 11 12 return dst 13 14 15my_dict = { 16 'a': 16, 'b': 29, 'c': 35, 'd': 55, 'e': 57, 'n': 70, 'o': 72, 'p': 101, 'q': 103 17} 18keys = list(my_dict.keys()) 19 20n = int(input()) 21for _ in range(n): 22 keys = my_shuffle(keys) 23 print(keys[:2])

関数の使い方にかなり無駄があるので、そのような基礎的な部分も改めて復習してください。

投稿2018/06/18 08:09

編集2018/06/20 17:42
LouiS0616

総合スコア35660

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問