Уведомления

Группа в Telegram: @pythonsu

#1 Авг. 20, 2013 12:45:48

penzu
От: Екатеринбург
Зарегистрирован: 2013-08-08
Сообщения: 12
Репутация: +  0  -
Профиль   Отправить e-mail  

Порядок вычисления строк.

Всем доброго дня. Озадачился я одним моментом.
Имеется матрица:

M=[[1,2,3],
      [4,5,6],
      [7,8,9]]

В общем произвожу следующее вычисление:

{sum(row) for row in M}

Результат выполнения:
{24, 6, 15}

Вопрос. Почему он вначале выдает сумму 2 рой строки по индексу , затем 0 , 1 ?


Отредактировано penzu (Авг. 20, 2013 12:47:40)

Офлайн

#2 Авг. 20, 2013 12:50:20

wbt
Зарегистрирован: 2013-08-13
Сообщения: 143
Репутация: +  6  -
Профиль   Отправить e-mail  

Порядок вычисления строк.

set([6,12,24])
#set([24, 12, 6])

set не есть упорядоченный список

M=[[1,2,3],
      [4,5,6],
      [7,8,9]]
[sum(row) for row in M]
#[6, 15, 24]



Бейсик - не порок, Гвидо - не пророк

Офлайн

#3 Авг. 20, 2013 12:52:47

penzu
От: Екатеринбург
Зарегистрирован: 2013-08-08
Сообщения: 12
Репутация: +  0  -
Профиль   Отправить e-mail  

Порядок вычисления строк.

Прошу прощения, не понял. Можно по подробней ?

Офлайн

#4 Авг. 20, 2013 12:55:43

wbt
Зарегистрирован: 2013-08-13
Сообщения: 143
Репутация: +  6  -
Профиль   Отправить e-mail  

Порядок вычисления строк.

считает он всё правильно. но конструкция { … } - это set, набор. оно не гарантирует, что строчки будут в том же порядке, что зашли в неё.

если заменить { … } на

 [ ... ] 
, то это будет список. в списке оно всё нормально, как и показано в моём коде выше.

>>> tuple(sum(row) for row in M)
(6, 15, 24)
>>> list(sum(row) for row in M)
[6, 15, 24]
>>> set(sum(row) for row in M)
set([24, 6, 15])



Бейсик - не порок, Гвидо - не пророк

Отредактировано wbt (Авг. 20, 2013 12:57:51)

Офлайн

#5 Авг. 20, 2013 13:00:26

penzu
От: Екатеринбург
Зарегистрирован: 2013-08-08
Сообщения: 12
Репутация: +  0  -
Профиль   Отправить e-mail  

Порядок вычисления строк.

Спасибо

Офлайн

#6 Авг. 20, 2013 13:04:44

penzu
От: Екатеринбург
Зарегистрирован: 2013-08-08
Сообщения: 12
Репутация: +  0  -
Профиль   Отправить e-mail  

Порядок вычисления строк.

Может быть ты ещё знаешь…
Есть такое выражение:

{x:ord(x) for x in 'spaam'}
{'a': 97, 'p': 112, 's': 115, 'm': 109}

в данном случае оно возвращает ключи из словаря.
Дак вот, чем выступает переменная X в данном случае ? Обычный список ?

Офлайн

#7 Авг. 20, 2013 13:13:15

wbt
Зарегистрирован: 2013-08-13
Сообщения: 143
Репутация: +  6  -
Профиль   Отправить e-mail  

Порядок вычисления строк.

переменая x здесь выступает переменной x

d = dict()
for x in 'spaam':
    d[x] = ord(x)
print d
# {'a': 97, 'p': 112, 's': 115, 'm': 109}

оно не возвращает ключи из словаря. ‘spaam’ - это, почитай, отсортированный список, и оно создаёт словарь, пять раз заглядывая в переменную x и пять раз создавая ключ и значение на его основе.

>>> for x in 'spaam':
...     print x
... 
s
p
a
a
m

Мне, собственно, непонятно, а в чём вопрос?



Бейсик - не порок, Гвидо - не пророк

Отредактировано wbt (Авг. 20, 2013 13:14:54)

Офлайн

#8 Авг. 20, 2013 16:43:10

Sergei
От:
Зарегистрирован: 2011-10-04
Сообщения: 29
Репутация: +  4  -
Профиль   Отправить e-mail  

Порядок вычисления строк.

wbt
считает он всё правильно. но конструкция { … } - это set, набор. оно не гарантирует, что строчки будут в том же порядке, что зашли в неё.если заменить { … } на
справедливости ради,
все же конструкция {} больше похожа на словарь, dictionary :) И да, порядка в словаре нет, он для хранения key-value.
Set - это ()



Офлайн

#9 Авг. 20, 2013 17:12:14

wbt
Зарегистрирован: 2013-08-13
Сообщения: 143
Репутация: +  6  -
Профиль   Отправить e-mail  

Порядок вычисления строк.

в python3 { } - это set

# python3
Python 3.3.2+ (default, Aug  4 2013, 15:50:24) 
[GCC 4.8.1] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> {1,2,3}
{1, 2, 3}
>>> set([1,2,3])
{1, 2, 3}



Бейсик - не порок, Гвидо - не пророк

Офлайн

#10 Авг. 20, 2013 19:48:19

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Порядок вычисления строк.

wbt,
третьего у меня под руками нет, но боюсь, что Вы не правы.
сделайте так

print( type({}) )



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version