我在一个大文件中有两列,比如说
pro1 lig1
pro2 lig2
pro3 lig3
pro4 lig1
.....
其次是列冗余。例如,我想要与给定组合不匹配的双倍大小的新随机组合
pro1 lig2
pro1 lig4
pro2 lig1
pro2 lig3
pro3 lig4
pro3 lig2
pro4 lig2
pro4 lig3
.....
谢谢。
我在一个大文件中有两列,比如说
pro1 lig1
pro2 lig2
pro3 lig3
pro4 lig1
.....
其次是列冗余。例如,我想要与给定组合不匹配的双倍大小的新随机组合
pro1 lig2
pro1 lig4
pro2 lig1
pro2 lig3
pro3 lig4
pro3 lig2
pro4 lig2
pro4 lig3
.....
谢谢。
如果您希望第一列中的每个值都有两个结果,我会强制使用不匹配的部分,如下所示:
import random
def gen_random_data(inputfile):
with open(inputfile, "r") as f:
column_a, column_b = zip(*(line.strip().split() for line in f))
for a, b in zip(column_a, column_b):
r = random.sample(column_b, 2)
while b in r: # resample if we hit a duplicate of the original pair
r = random.sample(column_b, 2)
yield a, r[0]
yield a, r[1]
使用一些排序、过滤、链接和列表推导,您可以尝试:
from itertools import chain
import random
random.seed(12345) # Only for fixing output, remove in productive code
words = [x.split() for x in """pro1 lig1
pro2 lig2
pro3 lig3
pro4 lig4""".split("\n")]
col1 = [w1 for w1,w2 in words]
col2 = [w2 for w1,w2 in words]
col1tocol2 = dict(words)
combinations = chain(*[
[(w1, w2) for w2 in
sorted(
filter(
lambda x: x != col1tocol2[w1],
col2),
key=lambda x: random.random())
[:2]]
for w1 in col1])
for w1,w2 in combinations:
print w1, w2
这给出了:
pro1 lig3
pro1 lig2
pro2 lig4
pro2 lig1
pro3 lig4
pro3 lig2
pro4 lig3
pro4 lig1
主要技巧是使用随机函数key
for sorted
。
c = """pro1 lig1
pro2 lig2
pro3 lig3
pro4 lig4"""
lines = c.split("\n")
set_a = set()
set_b = set()
for line in lines:
left, right = line.split(" ")
set_a |= set([left])
set_b |= set([right])
import random
for left in sorted(list(set_a)):
rights = random.sample(set_b, 2)
for right in rights:
print left, right
输出
pro1 lig2
pro1 lig4
pro2 lig4
pro2 lig3
pro3 lig1
pro3 lig4
pro4 lig2
pro4 lig1
假设您有两列:
col1 = ['pro1', 'pro2', ...]
col2 = ['lig1', 'lig2', ...]
那么最直接的方法是使用itertools.product
和random.sample
如下:
from itertools import product
from random import sample
N = 100 #How many pairs to generate
randomPairs = sample(list(product(col1, col2)), N)
如果col1
和col2
包含重复项,您可以通过set(col1)
和提取唯一项set(col2)
。
请注意,list(product(...))
将生成N * M
元素列表,其中N
和M
是列中唯一项目的数量。如果N * M
最终数量很大,这可能会导致问题。