2014-11-16 2 views
2

«Создайте текстовый документ с именем names.txt, который содержит список из 20 имен, каждый в своей строке. Напишите программу, которая читает имена из names.txt, а затем генерирует файл shuffle.txt, который содержит имена, перечисленные в произвольном порядке. (Не используйте метод списка .shuffle()) «Программа, которая перетасовывает

Это вопрос, который был задан. Мой код ниже, и я в тупике. Какие-нибудь советы?
BTW: Я сделаю новый файл после того, как узнаю, что он печатает правильно.

import random 

my_file=open('C://names.txt','r') 

name=my_file.read() 

my_list=name.split(",") 

for names in my_list: 

      my_list=random.randint(0,20) 

      print my_list 
+0

В чем проблема? Есть ли сообщение об ошибке? – twasbrillig

+0

Это печатные номера вместо имен в другом порядке –

+1

Дубликат http://stackoverflow.com/questions/17493008/python-shuffle-from-scratch – kwarunek

ответ

-1

Копировать + паста

import random 

f=open('/tmp/names.txt', 'r') 
array=f.readlines() # read all lines 
f.close() # release file 
array_len = len(array) 
for index in range(array_len): 
    swap = random.randrange(array_len - 1) 
    swap += swap >= index 
    array[index], array[swap] = array[swap], array[index] 
f=open('/tmp/shuffle.txt', 'w') # open dst file 
f.write("".join(array)) # save shuffled names 
f.close() # release - close file 
+0

Что такое индекс и почему вы закрываете f сразу? –

+0

Что это значит –

+0

swap + = swap> = index array [index], array [swap] = array [swap], array [index] –

0

Вот правильная реализация random.shuffle():

items = ['a', 'b', 'c', 'd'] # any list 
for i in range(len(items)): 
    j = random.randrange(i, len(items)) 
    items[i], items[j] = items[j], items[i] 

Некоторые стиль руководства расскажут вам использовать enumerate() вместо range(len(...)), но в этом случае на самом деле не делает код более приятным.

Алгоритм работает путем деления списка на два раздела: изначально пустой раздел слева и второй раздел справа. Каждый раз через цикл мы произвольно выбираем элемент из правого раздела, свопим его с самым левым элементом правого раздела и перемещая границу.

Используя наш список [1, 2, 3, 4], вот пример запуска:

  1. Левый раздел пуст. Просмотреть список как [] + ['a', 'b', 'c', 'd']
  2. random.randrange(0, 4)0.
  3. Обмен 'a' с нулевым элементом, который также имеет значение 'a'.
  4. Список сейчас ['a'] + ['b', 'c', 'd'].
  5. random.randrange(1, 4)3.
  6. Обмен 'b' с элементом 3, который является 'd'.
  7. Теперь у нас есть ['a', 'd'] + ['c', 'b'].
  8. random.randrange(2, 4) возвращается 2.
  9. Сменный 'c' с элементом 2, который бывает 'c'.
  10. У нас есть ['a', 'd', 'c'] + ['b'].
  11. random.randrange(3, 4) может только возвращаться 3.
  12. Swap 'b' с собой.
  13. Наш окончательный результат: ['a', 'd', 'c', 'b'].
Смежные вопросы