2012-06-24 3 views
1

Всякий раз, когда я использую перестановки, мне нужно создать список перестановок, потому что он возвращает объект itertools.permutations в 0x0190A5D0. Затем, после создания списка, мне нужно объединить строки в каждом списке, чтобы у меня была перестановка, которую я хотел первоначально. Если это число, я должен снова сделать их целыми.объединение строк n длины в списке python

Две части вопрос:

1) Есть ли более простой способ сделать перестановку и создать список номеров?

2) Ниже я создал перестановку числа с 5 цифрами. Однако, когда у меня есть «12345», я хочу, чтобы пользователь вводил свой номер. Таким образом, строка форматирования b = ['s% s% s ...] должна быть n% s и n x. Кто-нибудь знает, как это сделать?

(FYI моя программа пытается найти следующий наибольшее число с тех же цифр, заданных пользовательского ввода так +12345 Следующий по величине является 12354)

Оба вопроса были даны ответы ниже смотрите, пожалуйста, как ответы. Благодаря!!!

def nexthighest(): 
    from itertools import permutations 
    numb = str(12345) 
    a = list(permutations(numb)) 
    b = ['%s%s%s%s%s' % xxxxx for xxxxx in a] #<-- this is where the n length problem occurs 
    c = list(map(int,b)) 
    for i in c: 
     if i >12345: 
      print(i) 
      break 
+0

Вашего основного алгоритма нарушаются - например, если вы используете «897» в качестве входа, то первой перестановка, которую вы обнаружите, больше, чем я, будет 987, что * не * следующее наибольшее число с одинаковыми цифрами (978). Один из способов исправить это можно путем замены 'list (map (int, b))' на 'sorted (map (int, b))'. Лучшим способом было бы сделать 'numb = sorted (str (input_value)'. –

+2

Чтобы решить вашу проблему, вам не нужны перестановки _all_, только одна - а именно следующая в лексикографическом порядке. См. [Здесь] (http: /en.wikipedia.org/wiki/Permutation#Generation_in_lexicographic_order) для алгоритма – georg

ответ

4

Вам не нужно, чтобы собрать все эти списки. Просто перебирает значение, возвращаемого из permutations, присоединения и разбора как целые каждую перестановку, как это происходит с помощью:

def nexthigher(n): 
    for p in permutations(sorted(str(n))): 
     i = int("".join(p)) 
     if i > n: 
      return i 
+0

Следующий выше для n = 54321 возвращает None. 45321 возвращает 54321, но 51234 Следующее самое высокое. –

+0

@larsmans спасибо! Я не понимал, что «объект перестановок в ...» подразумевал, что он уже был в фоновом режиме и что я мог бы просто назвать его. Спасибо! –

+0

@Mark Tolonen hmmm любая причина, почему является ? Нужно ли его сортировать? –

1

Я могу ответить на вторую часть для вас:

b = ["".join(x) for x in a] 
+0

Omg Я не могу поверить, что я такой noob. У меня был такой же код без «[]», и в результате я создал строку от 123451235412435 ... Спасибо! –

+0

Youre welcome. Его небольшой трюк, используемый для преобразования списка/кортежа в строку путем объединения каждого значения с пустой строкой. – C0deH4cker

Смежные вопросы