Форум программистов, компьютерный форум, киберфорум
Python для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.87/15: Рейтинг темы: голосов - 15, средняя оценка - 4.87
117 / 101 / 53
Регистрация: 13.04.2014
Сообщений: 233
1

Функция создающая список строк из списка символов и длинны

08.05.2014, 18:45. Показов 3122. Ответов 10
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте! Помогите, пожалуйста. Мне надо создать функцию которая создаёт список строк из списка символов и длинны. Пример:
Python
1
2
3
4
5
6
7
## Запуск:
function(2,3,['a','b','c']) # 2-наименьшая длинна строки, 3-наибольшая длинна строки,['a','b','c']-символы перебора
## Результат:
['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',
'aa', 'ab', 'ac', 'ba', 'bb', 'bc', 'ca', 'cb', 'cc']# Т.е. должны быть все возможные комбинации
Как сделать?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
08.05.2014, 18:45
Ответы с готовыми решениями:

Рекурсивная функция, создающая список только из числовых элементов списка-аргумента
И еще одна просьба: описать функцию, которая создавала бы список тольео из числовых элементов...

Функция map, преобразование списка строк в двумерный список чисел
Вводится таблица целых чисел. Используя функцию map и генератор списков, преобразуйте список строк...

Набор символов в формате списка разбить в список чисел и список слов
Всем добрый день! Мне дали задачу написать программу, в которую вводится набор символов в...

Для заданного списка строк построить новый список, элементы которого расположены в зеркальном отражении относительно исходного списка
Приветик!Мне нужна помощь...у меня очень легкая задачка.Для заданного списка строк построить новый...

10
23 / 23 / 16
Регистрация: 17.01.2014
Сообщений: 81
08.05.2014, 23:45 2
Python
1
2
3
4
5
6
7
8
9
10
import itertools
 
def combinations(start, end, sequence):
    possible_combinations = []
    for number in range(start,end+1):
        for prod in itertools.product(sequence, repeat=number):
            possible_combinations.append("".join(str(elem) for elem in prod))
    return possible_combinations
 
print combinations(2,3,['a','b','c'])
Python
1
['aa', 'ab', 'ac', 'ba', 'bb', 'bc', 'ca', 'cb', 'cc', '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
117 / 101 / 53
Регистрация: 13.04.2014
Сообщений: 233
09.05.2014, 21:26  [ТС] 3
Спасибо большое!

Добавлено через 7 часов 3 минуты
Да это работает, но тогда при больших размерах(т.е. уже при старт=5) генерируется MemoryError(
Python
1
2
3
4
5
6
7
8
9
10
11
Exception in Tkinter callback
Traceback (most recent call last):
  File "C:\Python33\lib\tkinter\__init__.py", line 1475, in __call__
    return self.func(*args)
  File "C:\Python33\Scripts\file.pyw", line 40, in ok
    zap(k1,k2,k3,k4,k5,k6,kn,kk)
  File "C:\Python33\Scripts\file.pyw", line 29, in zap
    for e in combinations(int(kn),int(kk),s): o.write(e+'\n')
  File "C:\Python33\Scripts\file.pyw", line 16, in combinations
    possible_combinations.append("".join(str(elem) for elem in prod))
MemoryError
)
(т.е. надо избежать постоянного повторения типа оно каждый раз не высчитывается а где-то сохраняется)
Python
1
2
 for elem in sohran:
    for e2 in sequence:
только что-то не доходит как.
0
23 / 23 / 16
Регистрация: 17.01.2014
Сообщений: 81
13.05.2014, 14:01 4
Да, с памятью проблема. Нужно что-то изменять
0
2740 / 2339 / 620
Регистрация: 19.03.2012
Сообщений: 8,830
13.05.2014, 14:27 5
orAnd, пришлите входные данные с которыми у вас возникла ошибка.
И ещё сколько у вас ОЗУ и на машине с какой ОС вы запускали программу?

Добавлено через 2 минуты
TroSer, я думаю нужно писать это с использованием numpy и использовать итераторы.
0
42 / 42 / 7
Регистрация: 15.07.2012
Сообщений: 98
13.05.2014, 17:08 6
Попробуйте заменить:
Python
1
possible_combinations.append("".join(str(elem) for elem in prod))
на
Python
1
yield "".join(str(elem) for elem in prod)
и вызывать так:
Python
1
2
for e in combinations(2,3,['a','b','c']):
    print e
1
117 / 101 / 53
Регистрация: 13.04.2014
Сообщений: 233
13.05.2014, 19:53  [ТС] 7
Цитата Сообщение от tsar925 Посмотреть сообщение
orAnd, пришлите входные данные с которыми у вас возникла ошибка.
И ещё сколько у вас ОЗУ и на машине с какой ОС вы запускали программу?
Вызываю combinations(1,10,[1,2,3,4,5,6,7,8,9,0])
Сбивается примерно посередине
Что такое ОЗУ?
ОС windows 7, запускаю интерпритатором (или pythonw.exe) Pyton34
Цитата Сообщение от s0rg Посмотреть сообщение
Попробуйте заменить:
Python
1
possible_combinations.append("".join(str(elem) for elem in prod))
на
Python
1
yield "".join(str(elem) for elem in prod)
и вызывать так:
Код Python
Python
1
2
for e in combinations(2,3,['a','b','c']):
    print e
Спасибо. Попробую.

Добавлено через 48 минут
s0rg, Спасибо. Вроде бы работает.
Но всё равно очень медленно это можно как-нибудь избежать?
0
2740 / 2339 / 620
Регистрация: 19.03.2012
Сообщений: 8,830
13.05.2014, 20:04 8
Цитата Сообщение от orAnd Посмотреть сообщение
Что такое ОЗУ?
Оперативная память
0
923 / 639 / 198
Регистрация: 08.09.2013
Сообщений: 1,693
13.05.2014, 23:24 9
Цитата Сообщение от orAnd Посмотреть сообщение
Вызываю combinations(1,10,[1,2,3,4,5,6,7,8,9,0])
Если на машине меньше 128G памяти, вызывать функцию с такими параметрами нет смысла независимо от алгоритма реализации. Больше 100G займет только результирующий список.
Цитата Сообщение от orAnd Посмотреть сообщение
Но всё равно очень медленно это можно как-нибудь избежать?
Например, кэшируя промежуточные результаты.
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
cache= []
 
def comb (n1, n2, seq):
    ls= []
    if n2 > 0:
        if len (cache) > (n2 - 1) and len (cache [n2-1]) > 0:
            return cache [n2-1]
        for c in seq:
            if n1 < 2:
                ls.append (c)
            for s in comb (n1-1, n2-1, seq):
                ls.append (c + s)
        cache.append (ls)
    return ls
 
 
for s in comb (1,7,['1','2','3','4','5','6','7','8','9','0']):
    print s
Длина строки до 7 символов - это максимально, на что хватило моих 4 G, без кэширования, было бы до 8 символов, но раз в 100 дольше.
0
42 / 42 / 7
Регистрация: 15.07.2012
Сообщений: 98
14.05.2014, 17:26 10
Ускорить можно только как уже предложил gng, кэшеруя результат (но это также даст дополнительный расход памяти).
Мой вариан просто использует генератор, что позволяет сократить используемую память.
0
2740 / 2339 / 620
Регистрация: 19.03.2012
Сообщений: 8,830
14.05.2014, 17:47 11
Можно схитрить немного, использовать итераторы и после достижения данными определённого размера скидывать их временно на диск.
0
14.05.2014, 17:47
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
14.05.2014, 17:47
Помогаю со студенческими работами здесь

Функция, создающая окно.
Здравствуйте уважаемые. Есть функция создания окна function HelpWnd(WndPath){ ...

Функция создающая матрицу
Доброго времени суток!Есть программа которая выполняет определенные действия над матрицей,они...

Программа, создающая список
Составить программу, создающую список S и выводящую его после некоторой обработки: S - цепочка...

Задан набор символов и число n.Опишите функцию, которая возвращает список всех строк длины n, состоящих из этих символов
Здравствуйте. Задали задачу: Условие Задан набор символов и число n. Опишите функцию, которая...

Функция создающая новую матрицу
Нужна функция которая создает новую квадратную матрицу, где элементы вычисляются по формуле ...

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

Функция, создающая копию заданного дерева
Опишите функцию, которая строит копию данного дерева.


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru