我有两列在一个大的文件,说
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]
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
OUTPUT
pro1 lig2
pro1 lig4
pro2 lig4
pro2 lig3
pro3 lig1
pro3 lig4
pro4 lig2
pro4 lig1
使用一些排序,过滤,链接和列表理解,你可以试试:
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
进行sorted
。
假设你有两列:
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
最终成为一个非常大的数字。