Получение списка строк с символом, удаленным в перестановке - PullRequest
3 голосов
/ 21 декабря 2010

Я хочу удалить символ из строки в перестановке ....

Допустим, у меня есть функция

def (string,char):
    # remove char from string

Скажем, у меня aAabbAA в качестве строки иA как char, тогда я хочу, чтобы строки [aabb,aAabb,aabbA,aabbA, aabbAA,aAabbA ,aAabbA ] в качестве выходных данных были удалены A 3 раза, 2 раза, 1 раз.

Каков наилучший способ, которым я могу это сделать ??

Большое спасибо ....

Ответы [ 3 ]

3 голосов
/ 21 декабря 2010

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

def f(s, c, start):
    i = s.find(c, start)
    if i < 0:
        return [s]
    else:
        return f(s, c, i+1) + f(s[:i]+s[i+1:], c, i)

s = 'aAabbAA'
print f(s, 'A', 0)
# ['aAabbAA', 'aAabbA', 'aAabbA', 'aAabb', 'aabbAA', 'aabbA', 'aabbA', 'aabb']

Правка: Использование set:

def f(s, c, start):
    i = s.find(c, start)
    if i < 0:
        return set([s])
    else:
        return set.union(f(s, c, i+1), f(s[:i]+s[i+1:], c, i))

s = 'aAabbAA'
print f(s, 'A', 0)
# set(['aAabbA', 'aabbAA', 'aAabbAA', 'aabb', 'aAabb', 'aabbA'])

Правка 2: Использование троичного оператора:

def f(s, c, start):
    i = s.find(c, start)
    return [s] if i < 0 else f(s, c, i+1) + f(s[:i]+s[i+1:], c, i)

s = 'aAabbAA'
print f(s, 'A', 0)
# ['aAabbAA', 'aAabbA', 'aAabbA', 'aAabb', 'aabbAA', 'aabbA', 'aabbA', 'aabb']

Изменить 3: timeit:

In [32]: timeit.timeit('x = f("aAabbAA", "A", 0)', 
                       'from test3 import f', number=10000) 
Out[32]: 0.11674594879150391

In [33]: timeit.timeit('x = deperm("aAabbAA", "A")', 
                       'from test4 import deperm', number=10000) 
Out[33]: 0.35839986801147461

In [34]: timeit.timeit('x = f("aAabbAA"*6, "A", 0)', 
                       'from test3 import f', number=1) 
Out[34]: 0.45998811721801758

In [35]: timeit.timeit('x = deperm("aAabbAA"*6, "A")', 
                       'from test4 import deperm', number=1) 
Out[35]: 7.8437530994415283
1 голос
/ 21 декабря 2010

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

from itertools import product

def deperm(st, c):
    rsts = []
    indexes = [i for i, s in enumerate(st) if s == c]
    for i in product([c, ''], repeat=len(indexes)):
        newst = ''
        for j, ch in enumerate(st):
            if j in indexes:
                newst += i[indexes.index(j)]
            else:
                newst += ch
        rsts.append(newst)
    return rsts

for i in deperm('aAabbAA', 'A'):
    print i

Это выводит:

aAabbAA
aAabbA
aAabbA
aAabb
aabbAA
aabbA
aabbA
aabb
0 голосов
/ 21 декабря 2010

Здесь вам может помочь рекурсивный алгоритм. Извините, я не чемпион по питонам, поэтому вам, возможно, придется настроить синтаксис самостоятельно. Код Псуэдо:

// returns a set of strings (permutations)
def permutation(string, char)
  if len(string) == 0
    return [] // return empty set

  // get the set of permutations of suffix string recursively
 set_of_perm_suffix = permutation(string[1:], char)

 // prepend char to every string in set_of_perm
 appended_set = prepend_char(set_of_perm_suffix , string[0])

 // if the first char matches the one we should remove, we could either
 // remove it or keep it.
 if (string[0] == char)
   return union_of_sets(set_of_perm_suffix , appended_set)
 else
   // the first char doesn't match the one we should remove,
   // we need to keep it in every string of the set
   return appended_set
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...