大きなファイルに2つの列があります。
pro1 lig1
pro2 lig2
pro3 lig3
pro4 lig1
.....
2番目は列の冗長性です。たとえば、指定された組み合わせと一致しないダブルサイズの新しいランダムな組み合わせが必要です
pro1 lig2
pro1 lig4
pro2 lig1
pro2 lig3
pro3 lig4
pro3 lig2
pro4 lig2
pro4 lig3
.....
ありがとう。
大きなファイルに2つの列があります。
pro1 lig1
pro2 lig2
pro3 lig3
pro4 lig1
.....
2番目は列の冗長性です。たとえば、指定された組み合わせと一致しないダブルサイズの新しいランダムな組み合わせが必要です
pro1 lig2
pro1 lig4
pro2 lig1
pro2 lig3
pro3 lig4
pro3 lig2
pro4 lig2
pro4 lig3
.....
ありがとう。
1列目の値ごとに正確に2つの結果が必要な場合は、次のように、一致しない部分をブルートフォース攻撃します。
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
出力
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
。
2つの列があるとします。
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