создать список с 6-мерными уникальными элементами в Python - PullRequest
0 голосов
/ 06 марта 2019

Мне нужен список из 6 уникальных элементов, таких как 000001, 000002, 000003 и т. Д. Не обязательно указывать цифры, это может быть строка, например, AAAAAA, AAAAAB, ABCDEF и т. Д.

Если я сгенерирую список с np.arange(), у меня не будет 6-мерных элементов. Я только решил использовать "для" циклов, как

enter image description here

но я думаю, что есть много более удобных способов сделать это.

Ответы [ 3 ]

3 голосов
/ 06 марта 2019

Вам понадобится декартово произведение строки «ABCDEF», взятое пять раз (другими словами, произведение шести одинаковых строк). Его можно рассчитать с помощью функции product() из модуля itertools. Результатом продукта является список из 6 кортежей отдельных персонажей. Кортежи преобразуются в строки с join().

from itertools import product
symbols = "ABCDEF"
[''.join(x) for x in product(*([symbols] * len(symbols)))]
#['AAAAAA', 'AAAAAB', 'AAAAAC', 'AAAAAD', 'AAAAAE', 
# 'AAAAAF', 'AAAABA', 'AAAABB', 'AAAABC', 'AAAABD',...
# 'FFFFFA', 'FFFFFB', 'FFFFFC', 'FFFFFD', 'FFFFFE', 'FFFFFF']

Вы можете изменить значение symbols на любую другую комбинацию отдельных символов.

2 голосов
/ 06 марта 2019

Вы можете использовать функцию combinations_with_replacement():

from itertools import combinations_with_replacement

list(map(''.join, combinations_with_replacement('ABC', r=3)))
# ['AAA', 'AAB', 'AAC', 'ABB', 'ABC', 'ACC', 'BBB', 'BBC', 'BCC', 'CCC']

Если вам нужны все возможные комбинации, используйте функцию product():

from itertools import product

list(map(''.join, product('ABC', repeat=3)))
# ['AAA', 'AAB', 'AAC', 'ABA', 'ABB', 'ABC', 'ACA', 'ACB', 'ACC', 'BAA', 'BAB', 'BAC', 'BBA', 'BBB', 'BBC', 'BCA', 'BCB', 'BCC', 'CAA', 'CAB', 'CAC', 'CBA', 'CBB', 'CBC', 'CCA', 'CCB', 'CCC']
1 голос
/ 06 марта 2019

Вы можете использовать np.unravel_index, чтобы получить индексный массив:

idx = np.array(np.unravel_index(np.arange(30000), 6*(6,)), order='F').T
idx
# array([[0, 0, 0, 0, 0, 0],
#        [0, 0, 0, 0, 0, 1],
#        [0, 0, 0, 0, 0, 2],
#        ...,
#        [3, 5, 0, 5, 1, 3],
#        [3, 5, 0, 5, 1, 4],
#        [3, 5, 0, 5, 1, 5]])

Впоследствии вы можете заменить индексы более или менее на то, что вам нравится:

symbols = np.fromiter('ABCDEF', 'U1')
symbols
# array(['A', 'B', 'C', 'D', 'E', 'F'], dtype='<U1')
symbols[idx]
# array([['A', 'A', 'A', 'A', 'A', 'A'],
#        ['A', 'A', 'A', 'A', 'A', 'B'],
#        ['A', 'A', 'A', 'A', 'A', 'C'],
#        ...,
#        ['D', 'F', 'A', 'F', 'B', 'D'],
#        ['D', 'F', 'A', 'F', 'B', 'E'],
#        ['D', 'F', 'A', 'F', 'B', 'F']], dtype='<U1')

Если вам нужен результат в виде списка слов:

final = symbols[idx].view('U6').ravel().tolist()
final[:20]
# ['AAAAAA', 'AAAAAB', 'AAAAAC', 'AAAAAD', 'AAAAAE', 'AAAAAF', 'AAAABA', 'AAAABB', 'AAAABC', 'AAAABD', 'AAAABE', 'AAAABF', 'AAAACA', 'AAAACB', 'AAAACC', 'AAAACD', 'AAAACE', 'AAAACF', 'AAAADA', 'AAAADB']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...