Python从文件的每一行随机选择



我想从文本文件的每一行随机选择3个元素:

6717108 8373270 8670842 8671024 8671040 
8671069 8672185 
8672302 8672317 8672363 8672481 8672533 8672550 8672587 
8672610 
8672611 8672640 8672661 8672684 8688747 8688760 8688777 8688792 8688827 
8688836 8688884 8689003 8689037 
8672233 8688891 8688908 
8688971 8689078 

但是,我在每行中并不总是有3个元素,在这种情况下,应该将所有元素占用。因此,输出将是随机进行的:

6717108 8670842 8671040 
8671069 8672185 
8672317 8672481 8672533
8672610 
8672611 8688747 8688760 
8688836 8689003 8689037 
8672233 8688891 8688908 
8688971 8689078 

我的尝试是:

random_list = []
with open('my_inputFile', "r") as myFile:
    for line in myFile.readlines():
        myparts = line.split(' ')
        random_list.append(np.random.choice(myparts, 3))

输出格式将处于列表形式:

6717108
8670842
8671040
8671069
8672185
8672317
8672481
8672533
8672610
8672611
8688747
8688760
8688836
8689003
8689037
8672233
8688891
8688908
8688971
8689078

问题是:

我的代码在每行小于3个元素时都无法满足条件,并且显然不是在列表格式中。

只有在一行上有三个以上的元素时,才需要随机绘制。但您的代码样本"用更换",这意味着可以绘制相同的值两次(甚至三次(。因此,添加标志replace=False,或者更好,但只需使用random.sample();您不需要numpy

for line in myFile.readlines():
    myparts = line.split()
    if len(myparts) > 3:
        random_list.append(random.sample(myparts, 3))
    else:
        random_list.append(myparts)

尚不清楚您对输出的问题是什么,但是您以这种方式创建的random_list是列表。您可以根据需要将其打印出来。

如果您在末尾想要一个平面列表,则需要扩展方法,并且如果您不想多一次选择一项:

,请指定replace=False
random_list = []
​
with open('pathToFile/inputFile', 'r') as f:
    for line in f.readlines():
        myparts = line.strip().split(' ')
        if len(myparts) <= 3:
            random_list.extend(myparts)
        else:
            random_list.extend(np.random.choice(myparts, 3, replace=False))
random_list
['8670842',
 '6717108',
 '8671024',
 '8671069',
 '8672185',
 '8672363',
 '8672317',
 '8672587',
 '8672610',
 '8688827',
 '8672661',
 '8688792',
 '8688884',
 '8689037',
 '8689003',
 '8672233',
 '8688891',
 '8688908',
 '8688971',
 '8689078']
import random
random_list = []
with open('my_inputFile', "r") as myFile:
    for line in myFile.readlines():
        myparts = line.split(' ')
        l=len(myparts)
        if l< 4:
           random_list+=myparts
        else:
           for i in range(0,3):
               random_list+=[ myparts.pop(random.randrange(l))]
               l-=1

应该这样做。

最新更新