Добавление ассоциативных массивов в Python - PullRequest
1 голос
/ 21 марта 2011

Я уже давно искал решение этой проблемы, но пока безрезультатно. Я перехожу с php на python и сталкиваюсь с различием ассоциативных массивов, которое я не уверен, что теперь нужно преодолеть.

Возьми эту строку:

data[user]={i:{'item':row[0],'time':row[1]}}

Это перезаписывает каждую из моих data[user] записей, очевидно, поскольку она не добавляется, она просто заменяет данные каждый раз.

В php, если бы я хотел добавить новый бит данных в цикл for, я мог бы сделать

data[user][i][]=array('item'=>'x','time'=>'y'); // crude example

В питоне я не могу:

data[user][]={i:{'item':row[0],'time':row[1]}}

Это бранит на моем []

Я тоже не могу сделать:

data[user][i]={'item':row[0],'time':row[1]}

где я - мой итератор в цикле ... и я думаю, это потому, что data[user] еще не был определен как работающий? Я создал data={}, но я пока не заполняю его ключами.

Нужно ли в python определять ключ, прежде чем я смогу определить его, включая вложенный ключ?

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

Я могу сделать:

data[user,i]={'item':row[0],'time':row[1]}

но это не то, что я хочу.

Какой мой правильный метод, друзья Python?

Ответы [ 4 ]

9 голосов
/ 21 марта 2011

Нечто подобное должно работать. Обратите внимание, что в отличие от PHP, Python имеет отдельные примитивные типы для числовых массивов (называемых «списками») и ассоциативных массивов (называемых «словарями» или «dicts»).

if user not in data:
    data[user] = []
data[user].append({'item': row[0], 'time': row[1]})
4 голосов
/ 21 марта 2011
import collections

data = collections.defaultdict(list)
for user,row,time in input:
    data[user].append({'row':row, 'time':time})
1 голос
/ 21 марта 2011

Вы также можете использовать setdefault () и сделать что-то вроде:

userData = data.setdefault(user, {})
userData[i] = {'item': row[0], 'time': row[1]}
0 голосов
/ 21 марта 2011

Если data[user] является списком, вы можете добавить к нему data[user].append({'item':row[0],'time':row[1]}).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...