2016-01-15 1 views
0

Учитывая, что буквы x,y есть способ написать функцию python, которая возвращает последовательность списка, содержащую все возможные пары ([x,x], [x,y], [y,x], [y,y]) равное количество раз?Как создать последовательность списка в python, содержащую все возможные пары равное количество раз?

, например, я могу написать функцию, которая принимает входные данные (например, [x,y]) и количество раз должна появиться каждая возможная пара (например, 2), а затем возвращается, например, последовательность списка: [x x x y y x y y x]?

Предпочтительно я хотел бы функцию, чтобы сгенерировать «случайную» последовательность так, она может также возвращать:

[y x y y x x x y y] 

В обоих случаях [x,x] [x,y] [y,x] и [y,y] появляются ровно в два раза.

В идеале, я хотел бы найти решение, которое также работало, например, с 4 письмами [x,y,z,w].

+0

Есть ли у вас предпочтения в отношении того, сколько раз появляются пары? Мы можем сделать это с каждой упорядоченной парой, появляющейся ровно один раз, и циклически переходя через список, мы можем иметь любое желаемое количество повторений пар. – user2357112

+0

Будет ли это работать: '(xxyyzz) * n + x'? – georg

+2

Похоже, люди интерпретируют ваш вопрос по-разному. Не могли бы вы изменить свой вопрос, чтобы уточнить, что именно вы спрашиваете? – user2357112

ответ

3

Основываясь на ваших изменениях, следует провести тур, к которому вы обращались.

import random 
import itertools 

def generate_sequence(alphabet, num_repeats): 

    # generate the permutations of the list of size 2 
    # repeated `num_repeats` times 
    perms = [(letter1, letter2) for letter1, letter2 in itertools.product(alphabet, alphabet) for i in xrange(num_repeats)] 

    # save the original length of `perm` for later 
    perm_len = len(perms) 

    # randomly choose a starting point and add it to our result 
    curr_s, curr_e = random.choice(perms) 
    result = [curr_s, curr_e] 

    # remove the starting point from the list... on to the next one 
    perms.remove((curr_s, curr_e)) 

    # while we still have pairs in `perms`... 
    while len(perms): 

     # get all possible next pairs if the end of the current pair 
     # equals the beginning of the next pair 
     next_vals = [(s,e) for s,e in perms if s == curr_e] 

     # if there aren't anymore, we may have exhausted the pairs that 
     # start with `curr_e`, in which case choose a new random pair 
     if len(next_vals) != 0: 
      next_s, next_e = random.choice(next_vals) 
     else: 
      next_s, next_e = random.choice(perms) 

     # remove the next pair from `perm` and append it to the `result` 
     perms.remove((next_s, next_e)) 
     result.append(next_e) 

     # set the current pair to the next pair and continue iterating... 
     curr_s, curr_e = next_s, next_e 

    return result 

alphabet = ('x', 'y', 'z') 
num_repeats = 2 
print generate_sequence(alphabet, num_repeats) 

Это выводит

['z', 'z', 'z', 'x', 'x', 'y', 'z', 'y', 'y', 'z', 'y', 'x', 'y', 'x', 'z', 'x', 
'z', 'y', 'x'] 
+0

Думаю, вы неверно истолковали вопрос. Мы хотим создать 'x, y, y, z, x ...' данные 'x, y, z'. – user2357112

+1

@ user2357112 Если я следую вашему комментарию, учитывая пары '[['x', 'z'], ...]', вы хотите создать последовательность ['x', 'z', ...]? –

+0

Нам не дают пары. Нам задан набор букв, и мы хотим создать список, в котором смежные элементы списка образуют каждую возможную упорядоченную пару равное количество раз. – user2357112

1

При этом вы можете принять самые общие пары:

>>> from collections import Counter 
>>> dict(Counter(zip(a, a[1:])).most_common()) 
{('z', 'z'): 2, ('z', 'y'): 2, ('x', 'y'): 2, ('z', 'x'): 2, ('y', 'y'): 2, ('x', 'x'): 2, ('y', 'x'): 2, ('x', 'z'): 2, ('y', 'z'): 2} 

Если вы заботитесь только о парах:

>>> [t[0] for t in Counter(zip(a, a[1:])).most_common()] 
[('z', 'z'), ('z', 'y'), ('x', 'y'), ('z', 'x'), ('x', 'x'), ('y', 'x'), ('x', 'z'), ('y', 'y'), ('y', 'z')] 

Если вы только уход, пары которых появляются 2 раза с:

>>> [pair for pair, count in Counter(zip(a, a[1:])).items() if count == 2] 
[('z', 'z'), ('z', 'y'), ('x', 'y'), ('z', 'x'), ('x', 'x'), ('y', 'x'), ('x', 'z'), ('y', 'y'), ('y', 'z')]