1

我在一个大文件中有两列,比如说

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

其次是列冗余。例如,我想要与给定组合不匹配的双倍大小的新随机组合

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

谢谢。

4

4 回答 4

3

如果您希望第一列中的每个值都有两个结果,我会强制使用不匹配的部分,如下所示:

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]
于 2013-02-12T06:15:58.770 回答
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

主要技巧是使用随机函数keyfor sorted

于 2013-02-12T06:52:15.403 回答
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

输出

pro1 lig2
pro1 lig4
pro2 lig4
pro2 lig3
pro3 lig1
pro3 lig4
pro4 lig2
pro4 lig1
于 2013-02-12T06:11:54.500 回答
0

假设您有两列:

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最终数量很大,这可能会导致问题。

于 2013-02-12T06:09:24.033 回答