Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 按数据组洗牌文件中的文本_Python_Shell_Unix_Random_Shuffle - Fatal编程技术网

Python 按数据组洗牌文件中的文本

Python 按数据组洗牌文件中的文本,python,shell,unix,random,shuffle,Python,Shell,Unix,Random,Shuffle,我在寻找Python/Unix命令中的某种方法,通过基于第一个单词值(如下所示)进行分组来洗牌大型文本数据集- 输入文本: "ABC", 21, 15, 45 "DEF", 35, 3, 35 "DEF", 124, 33, 5 "QQQ" , 43, 54, 35 "XZZ", 43, 35 , 32 "XZZ", 45 , 35, 32 因此,它将被随机洗牌,但保持组在一起,如下所示 输出样本- "QQQ" , 43, 54, 35 "XZZ", 43, 35 , 32 "XZZ",

我在寻找Python/Unix命令中的某种方法,通过基于第一个单词值(如下所示)进行分组来洗牌大型文本数据集-

输入文本:

"ABC", 21, 15, 45
"DEF", 35, 3, 35
"DEF", 124, 33, 5
"QQQ" , 43, 54, 35
"XZZ", 43, 35 , 32
"XZZ", 45 , 35, 32
因此,它将被随机洗牌,但保持组在一起,如下所示

输出样本-

"QQQ" , 43, 54, 35  
"XZZ", 43, 35 , 32
"XZZ", 45 , 35, 32
"ABC", 21, 15, 45
"DEF", 35, 3, 35
"DEF", 124, 33, 5

我通过正常的洗牌找到了解决方案,但我不想在洗牌时保留组。

可以使用。通过按其第一个序列识别每一行,您可以轻松地对它们进行排序,然后仅对字典的键进行采样,如下所示:

import random
from collections import defaultdict

# Read all the lines from the file
lines = defaultdict(list)
with open("/path/to/file", "r") as in_file:
    for line in in_file:
        s_line = line.split(",")
        lines[s_line[0]].append(line)

# Randomize the order
rnd_keys = random.sample(lines.keys(), len(lines))

# Write back to the file?
with open("/path/to/file", "w") as out_file:
    for k in rnd_keys:
        for line in lines[k]:
            out_file.write(line)

希望这对您的努力有所帮助。

使用以下方法是可能的。通过按其第一个序列识别每一行,您可以轻松地对它们进行排序,然后仅对字典的键进行采样,如下所示:

import random
from collections import defaultdict

# Read all the lines from the file
lines = defaultdict(list)
with open("/path/to/file", "r") as in_file:
    for line in in_file:
        s_line = line.split(",")
        lines[s_line[0]].append(line)

# Randomize the order
rnd_keys = random.sample(lines.keys(), len(lines))

# Write back to the file?
with open("/path/to/file", "w") as out_file:
    for k in rnd_keys:
        for line in lines[k]:
            out_file.write(line)

希望这对您的工作有所帮助。

您也可以将文件中的每一行存储到嵌套列表中:

lines = []
with open('input_text.txt') as in_file:
    for line in in_file.readlines():
        line = [x.strip() for x in line.strip().split(',')]
        lines.append(line)
其中:

[['"ABC"', '21', '15', '45'], ['"DEF"', '35', '3', '35'], ['"DEF"', '124', '33', '5'], ['"QQQ"', '43', '54', '35'], ['"XZZ"', '43', '35', '32'], ['"XZZ"', '45', '35', '32']]
然后,您可以按第一项将这些列表分组为:

其中列出了分组项目的列表:

[[['"ABC"', '21', '15', '45']], [['"DEF"', '35', '3', '35'], ['"DEF"', '124', '33', '5']], [['"QQQ"', '43', '54', '35']], [['"XZZ"', '43', '35', '32'], ['"XZZ"', '45', '35', '32']]]
然后你可以用以下方法来洗牌:

这将提供一个完整的分组项目的随机列表:

[[['"QQQ"', '43', '54', '35']], [['"ABC"', '21', '15', '45']], [['"XZZ"', '43', '35', '32'], ['"XZZ"', '45', '35', '32']], [['"DEF"', '35', '3', '35'], ['"DEF"', '124', '33', '5']]]
现在,您所要做的就是将最终列表展平,并将其写入一个新文件,您可以使用:

这将为您的文件提供新的无序版本:

"QQQ", 43, 54, 35
"ABC", 21, 15, 45
"XZZ", 43, 35, 32
"XZZ", 45, 35, 32
"DEF", 35, 3, 35
"DEF", 124, 33, 5

您还可以将文件中的每一行存储到嵌套列表中:

lines = []
with open('input_text.txt') as in_file:
    for line in in_file.readlines():
        line = [x.strip() for x in line.strip().split(',')]
        lines.append(line)
其中:

[['"ABC"', '21', '15', '45'], ['"DEF"', '35', '3', '35'], ['"DEF"', '124', '33', '5'], ['"QQQ"', '43', '54', '35'], ['"XZZ"', '43', '35', '32'], ['"XZZ"', '45', '35', '32']]
然后,您可以按第一项将这些列表分组为:

其中列出了分组项目的列表:

[[['"ABC"', '21', '15', '45']], [['"DEF"', '35', '3', '35'], ['"DEF"', '124', '33', '5']], [['"QQQ"', '43', '54', '35']], [['"XZZ"', '43', '35', '32'], ['"XZZ"', '45', '35', '32']]]
然后你可以用以下方法来洗牌:

这将提供一个完整的分组项目的随机列表:

[[['"QQQ"', '43', '54', '35']], [['"ABC"', '21', '15', '45']], [['"XZZ"', '43', '35', '32'], ['"XZZ"', '45', '35', '32']], [['"DEF"', '35', '3', '35'], ['"DEF"', '124', '33', '5']]]
现在,您所要做的就是将最终列表展平,并将其写入一个新文件,您可以使用:

这将为您的文件提供新的无序版本:

"QQQ", 43, 54, 35
"ABC", 21, 15, 45
"XZZ", 43, 35, 32
"XZZ", 45, 35, 32
"DEF", 35, 3, 35
"DEF", 124, 33, 5

这个仍然是随机顺序的。我仍然无法理解行的第一个字符串的“分组”。很抱歉,我没有理解你所说的“分组”的意思。正如我提到的“基于第一个单词的分组”,正如您在示例输出中看到的,以“XZZ”开头的行和以“DEF”开头的行是完全相同的。这就是我所说的按第一个值分组的意思。行将是完整的,但类似的词,开始行也将“分组”我编辑了我的答案,以符合您的分组定义。我再次为第一次没有正确阅读而道歉。效果很好!谢谢,也谢谢你这么快;这一个仍然是随机顺序。我仍然无法理解行的第一个字符串的“分组”。很抱歉,我没有理解你所说的“分组”的意思。正如我提到的“基于第一个单词的分组”,正如您在示例输出中看到的,以“XZZ”开头的行和以“DEF”开头的行是完全相同的。这就是我所说的按第一个值分组的意思。行将是完整的,但类似的词,开始行也将“分组”我编辑了我的答案,以符合您的分组定义。我再次为第一次没有正确阅读而道歉。效果很好!谢谢,也谢谢你这么快;D