Понимание понимания списка по сравнению с традиционным циклом и сборкой - PullRequest
3 голосов
/ 03 июля 2011

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

Учитывая этот вызов:

def matrix_mult(m1, m2):
    """
      >>> matrix_mult([[1, 2], [3,  4]], [[5, 6], [7, 8]])
      [[19, 22], [43, 50]]
      >>> matrix_mult([[1, 2, 3], [4,  5, 6]], [[7, 8], [9, 1], [2, 3]])
      [[31, 19], [85, 55]]
      >>> matrix_mult([[7, 8], [9, 1], [2, 3]], [[1, 2, 3], [4, 5, 6]])
      [[39, 54, 69], [13, 23, 33], [14, 19, 24]]
    """

Я создал это решение, мне оно показалось наиболее логичным и соответствовало моему предыдущему опыту программирования, я более или менее набрал текст, как я думал ...

# 1 using a traditional List buildup method    
res = []
for i in range(len(m1)):
    sub = []
    for j in range(len(m2[0])):
        sub.append(row_times_column( m1, i, m2, j ))
    res.append(sub)
return res

Затем я нашел эторешение, которое показывало «понимание списка» (я переименовал переменные, чтобы они соответствовали моим, чтобы лучше обрабатывать различия между двумя решениями:

# 2 using list comprehension
res = [[0] * len(m1) for x in xrange(len(m2[0]))]
for i in range(len(res)):
   for j in range(len(res[i])):
       res[i][j] = row_times_column(m1, i, m2, j)
return res

Второе решение - построение матрицы на основе нуля, которая соответствует формепредполагаемый ответ, , но подразумевается ли этот метод под "пониманием списка" , или здесь что-то еще происходит?

Вот определение row_times_column () для полноты.

def row_times_column(m1, row, m2, column):
    """
      >>> row_times_column([[1, 2], [3, 4]], 0, [[5, 6], [7, 8]], 0)
      19
      >>> row_times_column([[1, 2], [3, 4]], 0, [[5, 6], [7, 8]], 1)
      22
    """
    i = 0
    for index, value in enumerate(m1[row]):
       i += value * m2[index][column]
    return i

Я подозреваю, что есть третий (и многие другие) способ решения этой проблемы, используя лямбду, но я подумал, что сначала я бы попросил прокомментировать эти 2.

Пример взят из http://openbookproject.net/thinkcs/python/english2e/ch09.html

РЕДАКТИРОВАТЬ Теперь у вас есть возможность лучше понимать список, спасибо за ответы, приведенные здесь.

Тем не менее, кто-нибудь может объяснить логикусоздания пустой матрицы, в которую помещены правильные ответы, а не просто создание нового списка?

Ответы [ 5 ]

7 голосов
/ 03 июля 2011

Понимание списка - это просто способ создания списка на основе другого списка. (Или другой повторяемый элемент)

Например, если у нас есть список a = [1, 2, 5, 7], мы могли бы создать список b, содержащий значения a, удвоенные двумя способами.

Без списочных представлений

b = []
for e in a:
    b.append(2*e)

со списком

b = [2*e for e in a]

В этом нет ничего больше, чем это. Это просто хороший синтаксис для построения списков на основе списков.

Смотри также:

3 голосов
/ 03 июля 2011

Далее также используется понимание списка для умножения матриц

def matrix_mult(m1, m2):
  return [[sum(m1[i][k]*m2[k][j] for k in range(len(m2))) for j in range(len(m2[0]))] for i in range(len(m1))]
3 голосов
/ 03 июля 2011

Первая строка - это понимание списка.Остальное нет.

 return [[row_times_column(m1, i, m2, j) for j in range(len(res[i]))]
     for i in range(len(res))]
1 голос
/ 04 июля 2011

Марк Пилигрим гораздо лучше объясняет понимание списка, чем я мог бы в его книге Погружение в Python .Эта книга действительно хороша для начинающих на Python и просто хорошо читается в целом.Рекомендовано.

PS: в Python 3 есть понимание списков, а в Dive into Python 3

1 голос
/ 03 июля 2011

Объяснение между пониманием списка в Python объясняется в PEP 202

Понимания списков предоставляют более краткий способ создания списков в ситуациях, когда в настоящее время используются циклы map () и filter () и / или вложенные циклы.

Так что в действительности за этой идеей не стоит "особой хитрости". Это всего лишь синтаксическое расширение , чтобы выразить его как PEP.

НТН

...