从两个柱随机生成独特的组合的(random generation of unique combina

2019-10-17 17:25发布

我有两列在一个大的文件,说

pro1 lig1
pro2 lig2
pro3 lig3
pro4 lig1
.....

二是列冗余。 我想这不应该匹配给定的组合,例如两倍大小的新的随机组合

pro1 lig2
pro1 lig4
pro2 lig1
pro2 lig3
pro3 lig4
pro3 lig2
pro4 lig2
pro4 lig3
.....

谢谢。

Answer 1:

如果你想正好有两个结果在一列中的每个值,我蛮力不匹配的部分,像这样的东西:

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]


Answer 2:

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


Answer 3:

使用一些排序,过滤,链接和列表理解,你可以试试:

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



Answer 4:

假设你有两列:

col1 = ['pro1', 'pro2', ...]
col2 = ['lig1', 'lig2', ...]

那么最直接的方式做到这一点是使用itertools.productrandom.sample如下:

from itertools import product
from random import sample

N = 100 #How many pairs to generate

randomPairs = sample(list(product(col1, col2)), N)

如果col1col2包含重复的项目,可以提取做了独特的项目set(col1)set(col2)

需要注意的是list(product(...))会产生N * M元素的列表,其中NM是在列的唯一项目的数量。 如果这会引起问题N * M最终成为一个非常大的数字。



文章来源: random generation of unique combination from two column