2016-10-09 3 views
0

У меня есть следующий код, который я хотел бы реагировать на исходный массив, который передается ему (буквы). В настоящее время он может обрабатывать буквы < = 3, однако я хотел бы сделать его расширяемым до n.Расширяющаяся функция, основанная на длине массива

В этом примере, если массив содержит только две записи ["a", "b"], он инициирует второй оператор if.

Как я могу изменить это, чтобы иметь эффективные бесконечные операторы if, допускающие массив любого размера?

import itertools 
import numpy as np 

#variable length 
letters = ["a", " b", " c"] 

increment = .1 
d = 3 
e = 3 

#Calculate total possible combinations and create array 
x=0 
for p in itertools.product(range(d), repeat=e): 
    x = x+1 

variable = np.arange(x) 
variable_s = [str(x) for x in variable] 


x=0 
#run loop based on array length. 
for p in itertools.product(range(d), repeat=e): 
    if len(letters) == 1: 
     variable_s[x] = letters[0]+str(format(p[0]/(increment)**(-1.0),'.2f')).replace("0.", "") 
    elif len(letters) == 2: 
     variable_s[x] = (
      letters[0]+str(format(p[0]/(increment)**(-1.0),'.2f')).replace("0.", "") 
      +letters[1]+str(format(p[1]/(increment)**(-1.0),'.2f')).replace("0.", "") 
     ) 
    elif len(letters) == 3: 
     variable_s[x] = (
      letters[0]+str(format(p[0]/(increment)**(-1.0),'.2f')).replace("0.", "") 
      +letters[1]+str(format(p[1]/(increment)**(-1.0),'.2f')).replace("0.", "") 
      +letters[2]+str(format(p[2]/(increment)**(-1.0),'.2f')).replace("0.", "") 
     ) 
    x = x+1 
variable_s 

Выход из кода выше будет: [ 'A00 B00 C00', 'A00 B00 с10', 'A00 B00 C20', 'A00 B10 C00', «A00 B10 с10 », 'a00 b10 c20', 'a00 b20 c00', 'a00 b20 c10', 'a00 b20 c20', 'a10 b00 c00', 'a10 b00 c10', 'a10 b00 c20' , 'a10 b10 c00', 'a10 b10 c10', 'a10 b10 c20', 'a10 b20 c00' , 'a10 b20 c10', 'a10 b20 c20', 'a20 b00 c00', 'a20 b00 c10', 'a20 b00 c20', 'a20 b10 c00', «a20 b10 c10 », 'a20 b10 c20', 'a20 b20 c00', 'a20 b20 c10', 'a20 b20 c20']

Если буквы = [ "а", "б"] выход будет : [ 'a00 b00', 'a00 b00', 'a00 b00', 'a00 b10', 'a00 b10', 'a00 b10', 'a00 b20', 'a00 b20', 'a00 b20', 'a10 b00', 'a10 b00', 'a10 b00', 'a10 b10', 'a10 b10', 'a10 b10', ' a10 b20' , 'a10 b20', 'a10 b20', 'a20 b00', 'a20 b00', 'a20 b00', 'a20 b10', 'a20 b10', «a20 b10 », 'a20 b20', 'a20 b20', 'a20 b20']

Если буквы [ "а", "б", "в" , "d", "e", "f", "g"]: ['a00 b00 c00 d00 e00 f00 g00', 'a00 b00 c00 d00 e00 f00 g10', ... и т. д.

+0

Что должен делать этот код? Почему бы не использовать 'itertools.combinations'? - Также для длин, вложенные для циклов, должны работать 'для i в диапазоне (len (буквы)): for li in range (i):' – sytech

+0

Я пытаюсь создать список каждой комбинации массива (до любой длины) и соответствующего номера. Затем этот список передается через другой цикл для модели регрессии. – sdhaus

+0

Я отредактировал ваш код, чтобы добавить перенос строк (и круглые скобки для этого), чтобы было легче увидеть повторение здесь – Eric

ответ

1

Возможно, попробуйте что-нибудь подобное?

import itertools 
import numpy as np 

#variable length 
letters = ["a", "b", "c", "d", "e", "f", "g"] 

n = len(letters) # Max limit for each element, ie. limit of 2 from [a, b], for k = 2 is ['a00 b00', 'a00 b10', 'a10 b00', 'a10 b10'] 
k = 3 # Number of elements we want to pick. 
variable_s = [] 

#run loop based on array length. 
for x, p in enumerate(itertools.product(range(n), repeat=k)): 
    variable_s.append(' '.join([letter + str(q).zfill(2)[::-1] 
         for letter, q in zip(letters, p)])) 
+0

'письма [: len (буквы)], p [:]' лучше написано 'буквы, p' – Eric

+0

Результат, который я получил от изменения инструкции if с тем, что вы дали, был ['0', '1', ' 2, 3, 4, 5, 6, 7, 8, 9, 10, , '15', '16', '17', '18', 19, 20, 21, 22, 23, 24, 27 ',' 28 ',' 29 ',' 30 ',' 31 ',' 32 ',' 33 ',' 34 ',' 35 ',' 36 ',' 37 ',' 38 ',' 39 ' , '40', '41', '42', '43', '44', '45', '46', '47', '48', '49', '50', '51', ' 52 ',' 53 ']. Я обновил вопрос с результатами, которые я ищу. – sdhaus

+0

Я также отредактировал ответ. Btw. для меня это работает отлично. Для 'k = 3' и' n = 7' i получили '['a00 b00 c00', 'a00 b00 c10', 'a00 b00 c20', 'a00 b00 c30' ..,' Существует также не нужно заранее знать количество комбинаций. Просто измените 'variable_s [x]' на 'variable_s.append()' и его штраф. – Nf4r

1

Вот наименьшее изменение, которое вы могли бы сделать - заменить if заявление с:

variable_s[x] = ''.join(
    letter+str(format(p_i/(increment)**(-1.0),'.2f')).replace("0.", "") 
    for letter, p_i in zip(letters, p) 
) 

Другие ноты:

  • p[1]/(increment)**(-1.0) лучше пишется p[1] * increment
  • x=0; for p in itertools.product(range(d), repeat=e): x = x+1 лучше пишется x = d**e
+0

Результат, который я получил от изменения инструкции if с тем, что вы дали, был [0, 1, 2, 3, 4, 5, 6, 7, 8 ',' 9 ',' 10 ',' 11 ',' 12 ',' 13 ',' 14 ',' 15 ',' 16 ',' 17 ',' 18 ',' 19 ',' 20 ' , 21, 22, 23, 24, 25, 26. Я обновил вопрос с результатами, которые я ищу. – sdhaus