LINUX.ORG.RU

Как в питоне словарь внутри себя использовать

 


0

1

Чего-то не понял в нем.

list=['a','a','a','b','c','c','c','c']
s = {i: s[i]+1 for i in list}
print(s)

Хотелось бы увидеть вывод вроде 'a':3, 'b':1, 'c':4 но возникает ошибка «NameError: name 's' is not defined» Если же просто присваивать допустим 1 каждому ключу, то нормально, но мне не это нужно.

★★★★★

Последнее исправление: praseodim (всего исправлений: 2)

Ответ на: комментарий от no-dashi-v2

Для тебя «контринтуитивно» что переменная должна быть инициализирована прежде чем использована? Ну тогда у меня для тебя плохие новости.

Нет, контринтуитивно не это, а то что в коде

s = {i: 0 for i in list}  
s = {i: s[i]+1 for i in list}
s[i]+1

делает совсем не то, что ожидалось на первый взгляд.

Хотя и насчет инициализации, не все так просто. Раз уж питон автоматически создает переменные при первом присвании, кроме того, например, в Perl конструкции $hash($i)++ вполне нормально работает для еще не использованного ключа и делает ровно то, что ожидается. Еще попадались контринтуитивные вещи со слайсами и с увеличением/уменьшением размерности массивов.

praseodim ★★★★★
() автор топика
Последнее исправление: praseodim (всего исправлений: 1)
Ответ на: комментарий от eternal_sorrow

цикл (for each) это «брать элементы по одному по порядку и выполнять процедуру для каждого из них»

forM_ :: (Foldable t, Monad m) => t a -> (a -> m b) -> m ()

list comprehension (ну и с dict тоже самое) это комбинация map, filter и join. использовать в нём что-то кроме чистых функций (выражений) это очень плохая идея. из чего сразу следует, что «объеденить» два значения из списка не получится. а значит ничто не мешает обрабатывать список в произвольном порядке (не про конкретный язык говорю, а вообще)

цикл строго более мощная конструкция (поэтому лучше их избегать когда можно обойтись более точными решниями)

caryoscelus
()

Ой я тоже поиграю

-- бруталити --
--свой итератор, итерирующий группы значений, а не значения
for p,value,num in xpairs({'a','a','a','b','c','c','c','c'}) do
    print(value..':'..num)
end
-- фаталити --
--метатабля позволяющая вызвать саму себя как функцию
list = setmetatable({'a','a','a','b','c','c','c','c'},m);
list();
-- бабалити --
--можно сократить до одной строчки и вот и всё
setmetatable({'a','a','a','b','c','c','c','c'},m)();

dron@gnu:~$ lua test.lua 
a:3
b:1
c:4

b:1
a:3
c:4

b:1
a:3
c:4
dron@gnu:~$ 

Нууу правда есть нюаааанс, нужно выше дописать сначала :D

-- метатаблю
m = {
     __call = function(self)
        self.t = {};
        for i,v in ipairs(self) do
            self.t[v] = self.t[v] and self.t[v] + 1 or 1;
        end
        for k,v in pairs(self.t) do
            print(k..':'..v);
        end
        self.t = nil;
end}
-- итератор
function xpairs(t)
    table.sort(t);
    local xpa = function(t,k)
         local c = 0;
         for i=k,#t+1 do
             if t[i] == t[k] then
                c = c + 1;
             else
                return k+c,t[k],c;
             end
         end
    end
    return xpa,t,1
end
LINUX-ORG-RU ★★★★★
()
Ответ на: комментарий от praseodim

Ты непроходимо не понимаешь как работает система, что такое контекст и почему s справа и s слева от знака равенства совершенно не одно и то же. Селффакай свой мозг сам

no-dashi-v2 ★★★
()
Ответ на: комментарий от eternal_sorrow

нет. map это «сохранить структуру, но заменить каждый элемент x на f(x)». структурой может быть любой функтор, в т.ч. деревья (для которых цикл уже не тривиален) или вызов функции (для которого цикл вообще не к месту)

caryoscelus
()
Ответ на: комментарий от rtxtxtrx

То генераторы - это отложенные вычисления, которые очень сильно экономят память. Их рекомендуется использовать везде. А питоновские await/async - сахарок над генераторами

rtxtxtrx
()
Ответ на: комментарий от no-dashi-v2

Ты непроходимо не понимаешь как работает система, что такое контекст и почему s справа и s слева от знака равенства совершенно не одно и то же. Селффакай свой мозг сам

Питон - это первый язык для меня, в котором идентификатор переменной справа и слева от знака равенства в общем случае указывают на разные вещи. Это было к вопросу о контринтуитивности.

praseodim ★★★★★
() автор топика
Ответ на: комментарий от praseodim

это значит что либо вы реально знаете очень похожие языки

либо что вы при большом количестве языков которые вы считаете знаете - знаете по сути не так глубоко

ибо похожее поведение можно обнаружить в тех же плюсах - в части когда есть присвоение по перегруженному индексу

в частности в общем случае семантика произвольна

a[i]=a[i]
qulinxao3
()
Ответ на: комментарий от qulinxao3

ибо похожее поведение можно обнаружить в тех же плюсах - в части когда есть присвоение по перегруженному индексу

Но это уже из разряда извращений :)

Так-то понятно, что Lvalue вычисляется и/или компилируется отдельно.

praseodim ★★★★★
() автор топика
Ответ на: комментарий от rtxtxtrx

Да и так ясно, что хто тестовое задание, с такими познаниями ему работа все равно не грозит

Удивляет как другие умеют судить. Я где-нибудь говорил, что это тестовое задание? Нет, это по текущей работе, возникла необходимость с питоном разбираться вот. Малой кровью не получается, похоже, если не вникать дотошно, то будут проблемы написать любой реальный, а не тестовый код. Как минимум, куча времени тратится.

Пока обходился документацией на метанит https://metanit.com/python/tutorial/3.6.php но видимо нужно въезжать в него по-настоящему. Что, кстати, посоветуешь для этого?

praseodim ★★★★★
() автор топика
Ответ на: комментарий от eternal_sorrow

list comprehension (ну и с dict тоже самое) это комбинация map

А map это не цикл?

map это отображение области определения функции на ее область значения. Оно поэтому так и называется, ты берешь каждый x и строишь график функции y = f(x). Математическая хрень, которую приспособили под практические нужды, то есть для использования как цикл. Некоторые пошли намного дальше и пристроили для практических целей целый ворох матана. Так родился хачкель. Отсюда вывод, что нужно уметь вовремя остановиться. Примерно на map/filter/reduce.

Virtuos86 ★★★★★
()
Ответ на: комментарий от Virtuos86

Ну, так в самом широком смысле - любое отображение из произвольного множества в произвольное кольцо, если считать, что «кольцо» - это тоже просто множество. )

vvn_black ★★★★★
()
Ответ на: комментарий от praseodim

Ничего. Я книг по питону прочитал только одну - классику дайвинг инто питон. И какую-то луца 1/3 или 1/4, там еще было показано как графы в виде кортежей представлять и операции над ними делать. А когда какие-то новые языки учил, то тупо туториала на сайте хватало типа готур

rtxtxtrx
()
Ответ на: комментарий от praseodim

поставь ipython там наряду с разной магией есть obj? и obj??

в любой современной ide можно goto defenition

питон идёт с достаточно качественно написаной стандартной библиотекой - папка Lib в каталоге установки

читай сырцы на гитхабе

не понятные строки кода гугли

один из методов освоение питона общий с lisp'ом в том числе repl

в частности можно в ipython нащупать последовательностей нужных действий и затем

дампануть свою сесию в файл:

with open("dumb.py","wt")as out:print(*In,sep='\n',file=out)

навести блеск посредством ide/editor и в дальнейшем в ipython(али в ide)

import dumb
...

т.е разработка при наличии replа может отличаться от чистого компиляй_линкуй_исправляй

есть конечно ливсистемы но это ваще в совсем других случаях

qulinxao3
()
Ответ на: комментарий от praseodim

у питона ( как и у си но своя) - очень элегантная модель исполнения

есть имена и есть объекты и есть пространства имён

объект это частный случай пространства имён со спецификой быть обьектом класса

класс это частный случай пространства имён со спецификой функции в н>м есть методы обьектов этого класса по умолчанию

модуль это частный случай пространнтва имён ....

так как python как правило интерпретируемый - то многие вещи разыменуются достаточно позно - но не обязательно в теже моменты что и в перле - вот поэтому и словари(асоц массивы мапы хэшмапы ..) по разному в частности

qulinxao3
()