#python #for-loop #list-comprehension
#python #for-loop #понимание списка
Вопрос:
Следующий оператор Python для понимания списка может быть перефразирован как цикл for, приведенный ниже.
>>> [(x,y) for x in range(5) if x % 2 == 0 for y in range(5) if y % 2 == 1]
>>> result = []
>>> for x in range(5):
if x % 2 == 0:
for y in range(5):
if y % 2 == 1:
result.append((x,y))
Мне трудно понять следующие два выражения понимания списка.
Какой эквивалентный для цикла (более удобный для чтения) способ их выражения?
[(min([row[i] for row in rows]),max([row[i] for row in rows]))
for i in range(len(rows[0]))]
[[random.random()*(ranges[i][1]-ranges[i][0]) ranges[i][0]
for i in range(len(rows[0]))] for j in range(k)]
Комментарии:
1. Первый — это доступ к матрице и выполнение min и max для значений в каждой ячейке матрицы. Я публикую это как комментарий, потому что другие намного быстрее меня.
2. Эта
range(len(x))
конструкция ужасно непитоновская.
Ответ №1:
Использовать свой стиль:
Я считаю, что первый делает это:
result = []
for col in range(len(rows[0])):
a = rows[0][col]
b = rows[0][col]
for row in rows:
a = min(a, row[col])
b = max(b, row[col])
result.append((a, b))
Ответ №2:
Вот пример расширения первого цикла , смотрите его здесь : http://codepad.org/cn0UFPrD
rows = [[1,2,3,4],[3,5,88,9],[4,55,-6,0],[0,34,22,1222]]
t1 = [(min([row[i] for row in rows]),max([row[i] for row in rows])) for i in range(len(rows[0]))]
print(t1)
# Easy loop
t2 = []
for i in range(len(rows[0])):
innerElements = []
for row in rows:
innerElements.append(row[i])
newTuple = ( min(innerElements),max(innerElements) )
t2.append(newTuple)
print(t2)
Вы можете расширить второй цикл таким же образом.