我一直在寻找 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
我通过正常的洗牌找到了解决方案,但我没有想到在洗牌时保持小组。
请您参考如下方法:
可以使用 collections.defaultdict 来做到这一点.通过按第一个序列识别每一行,您可以轻松地对它们进行排序,然后仅对字典的键进行采样,如下所示:
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)
希望这对您的努力有所帮助。
