Покажите возможные комбинации “n” числа и вычислять Вашу среднюю величину

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

def conj_pot(cp):
    lista = [[]]
    for x in cp:
        n_sub_conj = [sub_conj + [x] for sub_conj in lista]
        lista.extend(n_sub_conj)
    return lista

Ожидаемый ответ

ejemplo = conj_pot([4,5,6])

print(ejemplo)
[[],[4],[5],[4,5],[6],[4,6],[5,6],[4,5,6]]

Как получать среднюю величину каждого готового sub? А именно:

[4] promedio = 4/1 = 4

[5] promedio = 5/1 = 5

[4,5] promedio = (4+5)/2 = 4.5

[6] promedio = 6/1 = 6

[4,6] promedio = (4+6)/2 = 5

[5,6] promedio = (5+6)/2 = 5.5

[4,5,6] promedio = (4+5+6)/3 = 5
2
задан 19.03.2019, 11:47
1 ответ

Рассуждения

Заметь: Ответ estГЎ в конце этого post

Вопрос предлагает пример с [4, 5, 6], но я буду работать с этими nГєmeros изначально [9, 11, 8, 5].

Мотив этой decisiГіn - это, чтобы использовать схемы:

, Поскольку, получать средние величины треугольного массива, не используя условных

, я Также хочу ограничить, что, хотя Ваше планирование и soluciГіn они пошли на R , в выражении post, describiГі алгоритм, что помогает в ответе, который уходит проявляться acГЎ, включая оттенки, которые есть у Пайтона , и давая другой подход вопросу, так, что Ваш ответ не пренебрегает просвет в конце концов.

Индексируя

В этом случае могут отображать такие [9, 11, 8, 5] как диагональ квадратного массива, размеры которого точно равны длине главной диагонали, в этом случае четыре (4):

matrizTirangulaInferior

NГіtese ademГЎs, что треугольный нижний массив содержит все комбинации, которых требуют с Вашими соответствующими средними величинами, потому что он неважен (9+11)/2, что (11+9)/2.

Перед тем, как продолжать, - уместный показывать, что индекса для линий i и для колонн его j, и что longitud - largo de la diagonal.

, Когда наблюдается структура массива (4x4), ценит в себе, что нет операций promedio в Гєltima колонна, это подразумевает, что индекс j идет от 0 до longitud (в действительности serГ - в в longitud-1, но нуждаются tambiГ©n в стоимости диагонали) .

С другой стороны, у линий sГ - есть операции в Гєltima их, а именно: i=longitud.

Также важен видеть, что i>j это, прибавленное к факту, что разрывы в линиях массива благоразумные и как в этом случае их de uno a uno, возможно утверждать, что i=j+1.

Предыдущее может случаться следующего способа:

, Когда j=0, индекс i начинается в линии 1, и когда j=longitud, имеется i=longitud+1 (в действительности serГ - в в longitud, но нуждаются tambiГ©n в стоимости диагонали) .

Пайтон

, Видный предыдущее требует у себя (двух 02) функций:

  • Одна funciГіn помощи типа anГіnima, что разделил списки, и что был способен предотвращать неопределенная форма 0/0 и infinito = n/0 для различных совсем n нуля (0), этого, потому что в ответе видно, что одно из подмножеств - пустой список.
  • Она funciГіn, что вычислил средние величины треугольного массива, и что возвратил Вашу диагональ с ними demГЎs комбинации.

Она funciГіn anГіnima, чтобы делить списки

Эта tendrГ - в следующую форму

meanList = lambda l: sum(l)/(len(l) or 1)

AquГ - важное - когда: l=[] Ваша длина serГЎ cero и сумма Ваших элементов tambiГ©n. Но если тестируется следующее:

### (len(l) or 1)  ###
print(0 or 1) # Python imprime 1 (Interes en este caso)
print(3 or 1) # Python imprime 3 (Interes en este caso)
print(0 or 2) # Python imprime 2

print(0 and 1) # Python imprime 0
print(0 and 2) # Python imprime 0
print(0 and 0) # Python imprime 0

print(3 and 0) # Python imprime 0
print(3 and 1) # Python imprime 1
print(3 and 2) # Python imprime 2

Предыдущее подразумевает, что избегают делать условными if для того, чтобы был оценен знаменатель, если он или нет нулем (0).

, Хотя в этом случае не идет быть необходим использовать эту caracterГ-stica, как verГЎ mГЎs я продвинул, я pareciГі уместно обобщать ее funciГіn anГіnima, чтобы спасать неопределенную форму, потому что sГ - usarГЎ в ней funciГіn conj_pot(cp), напечатанная в вопросе.

Она funciГіn, чтобы сочетать и делить треугольный массив

, Хотя упоминают о массиве, вся работа - в travГ©s Вашей диагонали, в этом смысле, не необходима она construcciГіn массива, sГіlo использует его как рама ссылки для понимания, как индексируется диагональ .

def combinaPromMatrizTriangular(diagonal):
  ld = len(diagonal) # Longitud de la diagonal como vector
  vectorComb=[[]]    # Aqui iran las combinaciones con sublistas
  vectorProm=[0]     # Aqui iran los promedio de las combinaciones
                     # La funcion anonima meanList no evaluara
                     # en este caso la forma indeterminada 0/0

  for j in range(0,ld):                         # Columnas
    for i in range(j+1,ld+1):                   # Filas
      sc=diagonal[j:i]                          # Sub conjunto de la diagonal
      vectorComb.append(sc)                     # Se agrega subconjunto
      vectorProm.append(meanList(sc))           # Se promedia subconjunto

  # se retorna conjunto con sus promedios
  return [vectorComb, vectorProm]

ComprobaciГіn

Para достигнутые данные [4,5,6] в вопросе имеет по отношению к себе следующее:

a = combinaPromMatrizTriangular([4,5,6])
print(a[0])   #Combinaciones
# [[], [4], [4, 5], [4, 5, 6], [5], [5, 6], [6]]

print(a[1])  #Promedios
# [0, 4.0, 4.5, 5.0, 5.0, 5.5, 6.0]

, Хотя мне кажется необыкновенным способ делать списки с Пайтон [i*i for i in x] в этом случае, как есть две операции - сочетать и доставать среднюю величину - что должны делаться в укрытых циклах for, мне казаться уместным делать это таким образом.

, Чтобы заканчиваться, хотел ограничить, что полный список комбинаций a[0] может быть упорядоченным tambiГ©n, если его требуют.

Тем не менее, я считаю, что ввиду пространного вопроса и в существо порядок списков внутри реального списка с различными подходами , efectuГ© находится в новом вопросе, если он считается необходимым.

Rpta.: Я делю Списки внутри списка

, Как уже имеется она funciГіn anГіnima обобщенная meanList себе строит одна funciГіn promedioListas(x), которые называли бы ее:

meanList = lambda l: sum(l)/(len(l) or 1)

def promedioListas(x): return [meanList(dL) for dL in x]

, И ввиду того, что funciГіn conj_pot(cp) бросает подмножества включая пустоту не tendrГЎ incovenientes как уже explicГі

print(promedioListas(conj_pot([4,5,6])))
# [0.0, 4.0, 5.0, 4.5, 6.0, 5.0, 5.5, 5.0]
1
ответ дан 02.12.2019, 05:36

Теги

Похожие вопросы