Преобразование из понимания списка обратно в циклы for - PullRequest
0 голосов
/ 06 апреля 2019
     mins = X.min().values #array of min vals
     maxs = X.max().values #array of max vals   
     test = []
     test = {
            i: [np.random.randint(mins[t], maxs[t]) for t in range(len(mins))]
            for i in range(k)
        }

или это

for c in range(k):
     indices = [distances.index(row) for row in distances if row[-1] == c]         
     test[c] = X.iloc[indices].mean().values

Возможно ли преобразовать это понимание списка обратно в циклы for в python? Я относительно новичок в Python и у меня проблемы с синтаксисом.

Ответы [ 2 ]

2 голосов
/ 06 апреля 2019

Вы в основном просто работаете задом наперед, поэтому для начала у вас есть:

код 1

{i: [np.random.randint(mins[t], maxs[t]) for t in range(len(mins))] for i in range(k)}

Итак, первый шаг - for i in range(k) для генерации ключей, а затем что-то длясделайте с генерацией списка, или:

result = {}
for i in range(k):
    temp = [] 
    # something to do with making a list
    result[i] = temp

Затем, снова работая в обратном направлении, вы получите for t in range(len(mins)), оставив только np.random.randint(mins[t], maxs[t]) бит

Итак:

result = {}
for i in range(k):
    temp = []
    for t in range(len(mins)):
        temp.append(np.random.randint(mins[t], maxs[t]))
    result[i] = temp

В полном примере кода это будет

import numpy as np
mins = [1, 2, 3, 4]
maxs = [5, 6, 7, 8]
k = 3
test = []
test = {
    i: [np.random.randint(mins[t], maxs[t]) for t in range(len(mins))] for i in range(k)
    }
print(test)

result = {}
for i in range(k):
    temp = []
    for t in range(len(mins)):
        temp.append(np.random.randint(mins[t], maxs[t]))
    result[i] = temp
print(result)

Где первое - ваше понимание, а второе - для циклов.Результаты:

{0: [3, 3, 3, 4], 1: [2, 4, 3, 6], 2: [3, 2, 3, 5]}
{0: [4, 3, 4, 4], 1: [3, 3, 4, 4], 2: [3, 2, 6, 4]}

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

case 2

indices = [distances.index(row) for row in distances if row[-1] == c]         

Может быть разложентак же.Начиная с самого последнего for, мы находим:

for row in distances if row[-1] == c

, что соответствует:

for row in distances:
    if row[-1] == c
        #do something

Мы знаем, что все это заключено в список, поэтому добавление в список идобавление «чего-то» к нему довольно просто:

indices = []
for row in distances:
    if row[-1] == c:
        indices.append(distances.index(row))

Обратите внимание, что я не проверял это, хотя (и это также невозможно сделать с предоставленной информацией)

Еслимы помещаем это в оригинальный блок кода

for c in range(k):
    indices = [distances.index(row) for row in distances if row[-1] == c]        
    test[c] = X.iloc[indices].mean().values

Теперь у нас есть

for c in range(k):
    indices = []
    for row in distances:
        if row[-1] == c:
            indices.append(distances.index(row))        
     test[c] = X.iloc[indices].mean().values
2 голосов
/ 06 апреля 2019

Вот, пожалуйста:

test = {}
for i in range(k):
  test[i] = []
  for t in range(len(mins)):
    test[i].append(np.random.randint(mins[t], maxs[t]))

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...