Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Ассоциативный двумерный массив в Пайтоне, способы реализации ... 
:(
    Опции темы
Chuck
Дата 29.8.2006, 15:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Сушня
**


Профиль
Группа: Эксперт
Сообщений: 442
Регистрация: 12.12.2003
Где: Узбекистан, Ташке нт

Репутация: нет
Всего: 9



Нужно создать что то типа 
Код

a[0]['name'] = "Test"
a[0]['age'] = 23
a[0]['fname'] = "Test1"

a[1]['name'] = "Test1"
a[1]['age'] = 22
a[1]['fname'] = "Test2"

a[2]['name'] = "Test4"
a[2]['age'] = 26
a[2]['fname'] = "Test3"

 
Код

a =[]
a.append({"name" : "Test", "age": 23, "fname" : "Test1"})


Это сообщение отредактировал(а) Chuck - 29.8.2006, 15:33
PM MAIL WWW GTalk   Вверх
J2A
Дата 29.8.2006, 15:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 171
Регистрация: 17.11.2005
Где: Омск

Репутация: 16
Всего: 18



Вопрос в чем?
--------------------
Be easy, stay cool
PM MAIL WWW Jabber   Вверх
Chuck
Дата 29.8.2006, 15:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Сушня
**


Профиль
Группа: Эксперт
Сообщений: 442
Регистрация: 12.12.2003
Где: Узбекистан, Ташке нт

Репутация: нет
Всего: 9



Цитата(J2A @ 29.8.2006,  15:33)
Вопрос в чем?

Правильно ли я делаю, какие еще есть способы загрузки массива?
Если можно, с примерами!
PM MAIL WWW GTalk   Вверх
setq
Дата 29.8.2006, 16:09 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Неправильно, потому что словари под a[1] и a[2] сами по себе не появятся. Хотя в Python 2.5 можно попробовать реализовать это через defaultdict.

Если не 2.5, то пиши нужные индексы "руками" или реализуй свой класс defaultdict.


А... Да. Пример.

"Руками":
Код

>>> a = [{}, {}, {}]
>>> a[1]["boo"] = "far"
>>> a
[{}, {"boo": "far"}, {}]
>>>


Это сообщение отредактировал(а) setq - 29.8.2006, 16:15
  Вверх
Chuck
Дата 29.8.2006, 22:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Сушня
**


Профиль
Группа: Эксперт
Сообщений: 442
Регистрация: 12.12.2003
Где: Узбекистан, Ташке нт

Репутация: нет
Всего: 9



А в случае класса как быть, я в Питоне новичок, подскажите.
PM MAIL WWW GTalk   Вверх
Artemios
Дата 30.8.2006, 01:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 405
Регистрация: 14.8.2006
Где: Саратов, Россия

Репутация: 18
Всего: 50



А если кортежем попробовать словарь индексировать?
Код

>>> a = {}
>>> a[0,'name'] = 'Test'
>>> a[0,'age'] = 23
>>> a[0,'fname'] = 'Test1'
>>> a[1,'name'] = 'Test1'
>>> a[1,'age'] = 22
>>> a[1,'fname'] = 'Test2'
>>> a
{(0, 'fname'): 'Test1', (1, 'fname'): 'Test2', (1, 'name'): 'Test1', (0, 'name'): 'Test', (0, 'age'): 23, (1, 'age'): 22}



--------------------
fib = 1: 1: [ x+y | (x,y) <- zip fib (tail fib) ]
PM MAIL   Вверх
Void
Дата 30.8.2006, 01:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


Профиль
Группа: Участник Клуба
Сообщений: 2206
Регистрация: 16.11.2004
Где: Zürich

Репутация: 10
Всего: 173



Artemios, отличное решение в общем случае (даже немного быстрее, чем словарь словарей), но если потребуется найти все значения с заданным первым ключом, не зная наперёд значения второго ключа, он будет существенно менее удобен. Так что тут надо исходить из задачи.


--------------------
“Coming back to where you started is not the same as never leaving.” — Terry Pratchett
PM MAIL WWW GTalk   Вверх
setq
Дата 30.8.2006, 08:11 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Artemios, идея да, хорошая)


Chuck, общая схема такая: наследуем от dict свой класс, переопределяем метод __getitem__(self, x) чтобы он в случае отсутствия ключа, связывал его с {}.

Код

class MyDict(dict):
    def __getitem__(self, x):
        try:
            return super(MyDict, self).__getitem__(x)
        except LookupError:
            self[x] = y = {}
            return y

  Вверх
albertn
Дата 30.8.2006, 08:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 368
Регистрация: 17.7.2006
Где: г. Ставрополь

Репутация: 30
Всего: 34



Я бы сделал вот так, и не мучился:
Код

a = []
a.append({})
a[0]['name'] = "Test"
a[0]['age'] = 23
a[0]['fname'] = "Test1"
a.append({})
a[1]['name'] = "Test1"
a[1]['age'] = 22
a[1]['fname'] = "Test2"
a.append({})
a[2]['name'] = "Test4"
a[2]['age'] = 26
a[2]['fname'] = "Test3"

PM WWW ICQ   Вверх
pythonwin
Дата 30.8.2006, 11:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2529
Регистрация: 18.4.2006
Где: за компом

Репутация: 14
Всего: 36



При помощи класса:
Код

class E1:
    name = ''
    age = ''
    fname = ''
    def __init__(self, name, agem, fname):
        self.name = name
        self.age = age
        self.fname = fname
n=int(raw_input(u"Введите целое число = "))
l=[]
for x in range(n):
    name=raw_input(str(x)+") name = ")
    age=raw_input(str(x)+") age = ")
    fname=raw_input(str(x)+") fname = ")
    l+=[E1(name, age, fname)]

PM WWW GTalk Jabber   Вверх
Chuck
Дата 30.8.2006, 15:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Сушня
**


Профиль
Группа: Эксперт
Сообщений: 442
Регистрация: 12.12.2003
Где: Узбекистан, Ташке нт

Репутация: нет
Всего: 9



Код

import time

class Messages:
        itemscount = 0
        messages = []
        def add(self, username, to, message, time):
                print "Add "+itemscount+" item"
                self.messages.append({})
                self.messages[itemscount]["user"] = username
                self.messages[itemscount]["to"] = to
                self.messages[itemscount]["message"] = message
                self.messages[itemscount]["time"] = time
                itemscount = itemscount + 1

        def list(self):
                for item in self.messages:
                        print item["from"]+"-->"+item["to"]+":"+item["message"]

Msg = Messages()
Msg.add("Chuck", "Flexx", "Hello, friend", time.time)
Msg.add("Chuck", "Flexx", "Hello, friend12", time.time)
Msg.add("Chuck", "Flexx", "Hello, friend12", time.time)

Msg.list()


Что то не получается ...
Ошибка
Код

Traceback (most recent call last):
  File "test.py", line 20, in ?
    Msg.add("Chuck", "Flexx", "Hello, friend", time.time)
  File "test.py", line 7, in add
    print "Add "+itemscount+" item"
UnboundLocalError: local variable 'itemscount' referenced before assignment





Это сообщение отредактировал(а) Chuck - 30.8.2006, 15:03
PM MAIL WWW GTalk   Вверх
Void
Дата 30.8.2006, 16:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


Профиль
Группа: Участник Клуба
Сообщений: 2206
Регистрация: 16.11.2004
Где: Zürich

Репутация: 10
Всего: 173



Chuck, переменная класса itemscount не глобальная: обращаться к ней надо либо как self.itemscount, либо как Messages.itemscount.
Во-вторых, вот так:
Код
print "Add "+itemscount+" item"

нельзя, надо
Код
print "Add %i item" % Messages.itemscount
# или
print "Add " + str(Messages.itemscount) + " item"


А что за задача, поподробнее нельзя? Может лучше БД использовать? Например, SQLite in-memory database много оверхеда не создаст.

Это сообщение отредактировал(а) Void - 30.8.2006, 16:16


--------------------
“Coming back to where you started is not the same as never leaving.” — Terry Pratchett
PM MAIL WWW GTalk   Вверх
Artemios
Дата 30.8.2006, 18:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 405
Регистрация: 14.8.2006
Где: Саратов, Россия

Репутация: 18
Всего: 50



Цитата(Void @ 30.8.2006,  16:15)
надо
Код
print "Add %i item" % Messages.itemscount
# или
print "Add " + str(Messages.itemscount) + " item"

или
Код

print "Add",Messages.itemscount,"item"



--------------------
fib = 1: 1: [ x+y | (x,y) <- zip fib (tail fib) ]
PM MAIL   Вверх
pythonwin
Дата 31.8.2006, 14:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2529
Регистрация: 18.4.2006
Где: за компом

Репутация: 14
Всего: 36



Artemios, а какой вариант быстрее?
PM WWW GTalk Jabber   Вверх
Artemios
Дата 1.9.2006, 00:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 405
Регистрация: 14.8.2006
Где: Саратов, Россия

Репутация: 18
Всего: 50



pythonwin
Цитата(pythonwin @  31.8.2006,  14:47 Найти цитируемый пост)
Artemios, а какой вариант быстрее? 

Как мне кажется, самый первый вариант
Код
print "Add %i item" % Messages.itemscount

во втором варианте чуть замедлит конкатенация строк
Код
print "Add " + str(Messages.itemscount) + " item"

но в print-е это уже неимеет значения, т.к. I/O операции выполняются гораздо дольше, и поэтому самый медленный - мой вариант, так как нискоуровневый I/O здесь, кажись, выполняется для каждого аргумента поотдельности - значит здесь 3 раза:
Код
print "Add",Messages.itemscount,"item"



Это сообщение отредактировал(а) Artemios - 1.9.2006, 00:28


--------------------
fib = 1: 1: [ x+y | (x,y) <- zip fib (tail fib) ]
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Python: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0877 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.