teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

3

今更だけど、無駄な処理をしてたので修正。

2018/06/20 17:42

投稿

LouiS0616
LouiS0616

スコア35678

answer CHANGED
@@ -10,8 +10,8 @@
10
10
 
11
11
 
12
12
  def my_shuffle(src):
13
+ dst = src[:]
13
14
  while True:
14
- dst = src[:]
15
15
  random.shuffle(dst)
16
16
 
17
17
  if src[0] != dst[0]:
@@ -31,28 +31,28 @@
31
31
  main()
32
32
  ```
33
33
 
34
- **実行結果** [Wandbox](https://wandbox.org/permlink/ZqJTMqamvafVMi3Q)
34
+ **実行結果** [Wandbox](https://wandbox.org/permlink/EKjPqj85WXTMt1wh)
35
35
  ```
36
- [3, 2, 1]
37
36
  [2, 1, 3]
37
+ [3, 1, 2]
38
38
  [1, 3, 2]
39
+ [3, 2, 1]
40
+ [1, 3, 2]
39
41
  [2, 3, 1]
40
- [1, 2, 3]
42
+ [3, 2, 1]
41
43
  [2, 1, 3]
44
+ [1, 3, 2]
45
+ [2, 1, 3]
42
46
  [3, 2, 1]
43
47
  [2, 1, 3]
44
- [1, 2, 3]
45
48
  [3, 1, 2]
46
- [2, 1, 3]
47
49
  [1, 3, 2]
48
50
  [3, 2, 1]
49
- [2, 3, 1]
50
- [3, 1, 2]
51
51
  [2, 1, 3]
52
+ [1, 3, 2]
52
53
  [3, 1, 2]
53
54
  [2, 3, 1]
54
- [3, 2, 1]
55
+ [3, 1, 2]
55
- [1, 2, 3]
56
56
  ```
57
57
 
58
58
  上記コードの`my_shuffle`では第一要素が変わるまで何回もシャッフルし続けています。
@@ -65,8 +65,8 @@
65
65
 
66
66
 
67
67
  def my_shuffle(src):
68
+ dst = src[:]
68
69
  while True:
69
- dst = src[:]
70
70
  random.shuffle(dst)
71
71
 
72
72
  if src[0] != dst[0]:

2

追記

2018/06/20 17:42

投稿

LouiS0616
LouiS0616

スコア35678

answer CHANGED
@@ -1,7 +1,7 @@
1
1
  まず、Pythonの辞書は順序を保証しません。
2
2
  ですので、順序を取り扱いたいときは辞書は用いてはなりません。
3
3
 
4
- 一度`list(d.keys())`を取得したら、それを使うようにしてください。
4
+ 一度`list(辞書.keys())`を取得したら、それを使うようにしてください。
5
5
 
6
6
  ---
7
7
  リストの第一要素を毎回変えたい場合、例えば次のような実装が考えられます。
@@ -55,4 +55,35 @@
55
55
  [1, 2, 3]
56
56
  ```
57
57
 
58
- 上記コードの`my_shuffle`では第一要素が変わるまで何回もシャッフルし続けています。
58
+ 上記コードの`my_shuffle`では第一要素が変わるまで何回もシャッフルし続けています。
59
+
60
+ 書いてみた
61
+ ---
62
+ 上記の点を踏まえると次のように書くことが出来ます。
63
+ ```Python
64
+ import random
65
+
66
+
67
+ def my_shuffle(src):
68
+ while True:
69
+ dst = src[:]
70
+ random.shuffle(dst)
71
+
72
+ if src[0] != dst[0]:
73
+ break
74
+
75
+ return dst
76
+
77
+
78
+ my_dict = {
79
+ 'a': 16, 'b': 29, 'c': 35, 'd': 55, 'e': 57, 'n': 70, 'o': 72, 'p': 101, 'q': 103
80
+ }
81
+ keys = list(my_dict.keys())
82
+
83
+ n = int(input())
84
+ for _ in range(n):
85
+ keys = my_shuffle(keys)
86
+ print(keys[:2])
87
+ ```
88
+
89
+ 関数の使い方にかなり無駄があるので、そのような基礎的な部分も改めて復習してください。

1

コードの変更

2018/06/18 08:19

投稿

LouiS0616
LouiS0616

スコア35678

answer CHANGED
@@ -9,54 +9,50 @@
9
9
  import random
10
10
 
11
11
 
12
- def shuffled(src):
13
- """引数自体を変更せずに、シャッフルしたリストを返す。"""
14
- dst = src[:]
15
- random.shuffle(dst)
16
- return dst
17
-
18
-
19
12
  def my_shuffle(src):
13
+ while True:
20
- dst = src
14
+ dst = src[:]
15
+ random.shuffle(dst)
16
+
21
- while src[0] == dst[0]:
17
+ if src[0] != dst[0]:
22
- dst = shuffled(src)
18
+ break
23
-
19
+
24
20
  return dst
25
21
 
26
22
 
27
23
  def main():
28
24
  my_list = [1, 2, 3]
29
25
  for _ in range(20):
26
+ my_list = my_shuffle(my_list)
30
27
  print(my_list)
31
- my_list = my_shuffle(my_list)
32
28
 
33
29
 
34
30
  if __name__ == '__main__':
35
31
  main()
36
32
  ```
37
33
 
38
- **実行結果** [Wandbox](https://wandbox.org/permlink/4QOvld8TcOZGv2Ba)
34
+ **実行結果** [Wandbox](https://wandbox.org/permlink/ZqJTMqamvafVMi3Q)
39
35
  ```
40
- [1, 2, 3]
41
36
  [3, 2, 1]
37
+ [2, 1, 3]
42
38
  [1, 3, 2]
43
- [3, 1, 2]
44
- [2, 1, 3]
45
- [3, 1, 2]
46
39
  [2, 3, 1]
47
40
  [1, 2, 3]
41
+ [2, 1, 3]
48
42
  [3, 2, 1]
49
- [2, 3, 1]
43
+ [2, 1, 3]
44
+ [1, 2, 3]
45
+ [3, 1, 2]
46
+ [2, 1, 3]
50
47
  [1, 3, 2]
51
- [2, 1, 3]
52
48
  [3, 2, 1]
53
49
  [2, 3, 1]
50
+ [3, 1, 2]
54
- [1, 2, 3]
51
+ [2, 1, 3]
52
+ [3, 1, 2]
53
+ [2, 3, 1]
55
54
  [3, 2, 1]
56
55
  [1, 2, 3]
57
- [2, 1, 3]
58
- [3, 1, 2]
59
- [1, 3, 2]
60
56
  ```
61
57
 
62
58
  上記コードの`my_shuffle`では第一要素が変わるまで何回もシャッフルし続けています。