洗牌的程序

时间:2014-11-16 23:17:20

标签: python python-2.7

“创建一个名为names.txt的文本文档,其中包含20个名称的列表,每个名称都在各自的行上。编写一个从names.txt读取名称的程序,然后生成一个名为shuffle.txt的文件,其中包含名称按随机顺序列出。(不要使用.shuffle()列表方法)“

这就是被问到的问题。我的代码在下面,我很难过。有什么提示吗? 顺便说一句:我知道它正确打印后我会做新文件。

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

2 个答案:

答案 0 :(得分: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. 使用元素3交换'b',即'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. 与自己交换'b'
  13. 我们的最终结果是['a', 'd', 'c', 'b']

答案 1 :(得分:-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