Python: Как извлечь имя переменной словарной записи? - PullRequest
2 голосов
/ 25 марта 2009

Мне интересно, как мне найти имя переменной элемента словаря:

Например:

    >>>dict1={}
    >>>dict2={}

    >>>dict1['0001']='0002'
    >>>dict2['nth_dict_item']=dict1
    >>>print dict2
    {'nth_dict_item': {'0001': '0002'}}
    >>>print dict2['nth_dict_item']
    {'001': '002'}

Как я могу заставить его сказать, что dict2 ['nth_dict_item'] является или ссылается на "dict1"? Мне нужно имя структуры данных, на которую она ссылается, а не сами данные.

Если я сравниваю выходные данные id (dict1) с id (dict2 ['nth_dict_item']), я могу обнаружить, что они совпадают.

Но как я могу превратить этот идентификатор обратно в имя переменной? Есть ли более прямой / более чистый метод получения информации, которую я хочу знать?

Я уверен, что просто пропускаю функцию, которая облегчит мою жизнь, но я довольно плохо знаком с Python:)

Любая помощь приветствуется, спасибо!

Относящиеся


Обновление: вот почему я хотел, чтобы это работало:

Я пытаюсь создать приложение, которое использует словарь, вроде базы данных. Я хотел, чтобы функционал этого psuedocode функционировал:

dict_1={}
dict_2={}
dict_3={}

dict_1["FooBar1.avi"]=[movie_duration,movie_type,comments]
dict_2["FooBar2.avi"]=[movie_duration,movie_type,comments]
dict_3["FooBar3.avi"]=[movie_duration,movie_type,comments]

dict_database[SomeUniqueIdentifier1]=dict_1
dict_database[SomeUniqueIdentifier2]=dict_2
dict_database[SomeUniqueIdentifier3]=dict_3

SomeUniqueIdentifier # будет уникальным значением, которое я использую в качестве ключа базы данных / unqiueID для поиска записей.

Я хочу иметь возможность обновлять поле "комментарии" в FooBar1.avi:

WhichDict= dict_database[SomeUniqueIdentifier1]
WhichDict[WhichDict.keys()[0]][2]='newcomment'

вместо того, чтобы делать:

dict_database['SomeUniqueIdentifier1'][dict_database['SomeUniqueIdentifier1'].keys()[0]][2]='newcomment'

Спасибо всем. Теперь я понимаю, что я неправильно понял МНОГО основ (полный пердеж мозга). Вернусь и исправлю дизайн. Спасибо вам всем!

Ответы [ 7 ]

9 голосов
/ 25 марта 2009

Имя переменной - это просто имя - оно не имеет реального смысла в отношении программы, кроме как для удобства программиста (это не совсем так в Python, но потерпите меня). Что касается интерпретатора Python, имя dict1 - это просто способ, которым программист говорит Python взглянуть на адрес памяти 0x1234.

Более того, сама идея преобразования адреса памяти (0x1234) обратно в имя переменной (dict1) не имеет смысла, особенно если учесть, что несколько имен переменных могут ссылаться на один и тот же объект:

dict1 = {...}
dictCopy = dict1

Теперь dictCopy такое же имя словаря, как и dict1 - они оба ссылаются на одно и то же. Если существующая функция существует, какое имя должен выбрать Python?

7 голосов
/ 25 марта 2009

Добавить то, что сказал Зеназн:

Но как я могу превратить этот идентификатор обратно в имя переменной?

Короткий ответ: ты не хочешь этого действительно хотеть. Если вы считаете, что это необходимо, то с дизайном вашей программы что-то не так. Если бы вы более конкретно сказали нам, какую проблему пытались решить, мы могли бы помочь вам найти лучший способ ее решения.

4 голосов
/ 25 марта 2009

Тривиальный ответ: вместо

WhichDict[WhichDict.keys()[0]][2]='newcomment'

использование:

WhichDict.values()[0][2]='newcomment'

Но использование словаря для представления одного фильма крайне неуместно. Почему бы не использовать вместо этого класс?

class Movie(object):
    def __init__(self, filename, movie_duration, movie_type, comments):
        self.filename = filename
        self.movie_duration = movie_duration
        self.movie_type = movie_type
        self.comments = comments

database = dict()
database['unique_id_1'] = Movie("FooBar1.avi", duration, type, comments)
# ...

some_movie = database[some_id]
some_movie.comment = 'newcomment'
1 голос
/ 25 марта 2009

Прямо сейчас, для каждого фильма вы делаете:

dict_n = {}
dict_n["000n"] = [movie_duration,movie_type,comments]

только с одной записью на диктовку. Затем вы сохраняете несколько кинокадров в центральном:

dict_database = {}
dict_database["0001"] = dict_1
dict_database["0002"] = dict_2
dict_database["0003"] = dict_3
dict_database["000n"] = dict_n

Редактировать: Это, вероятно, то, что вы имели в виду.

Для каждого фильма есть переход от имен свойств к значениям.

movie_n = {}
movie_n["movie_duration"] = 333
movie_n["movie_type"] = "Fantasy"
movie_n["comments"] = ""

Тогда movies["any_file.avi"] дает вам этот дикт. Чтобы добавить фильм в каталог, а затем добавить комментарий, введите:

movies["any_file.avi"] = movie_n
movies["any_file.avi"]["comments"] = "new comment"

Если вам нужно выбрать между номером этого фильма и именем файла, я бы выбрал имя файла, потому что оно просто более уместно, когда вы на самом деле пытаетесь получить доступ к фильму. Кроме того, при необходимости вы можете перечислить свои фильмы (хотя и не по порядку) через movies.keys() или что-то подобное. Если вы хотите использовать как номер, так и имя файла, добавьте имя файла в качестве другого ключа для каждого фильма.

movie_n["filename"] = "any_file.avi"

или

movies["000n"]["filename"] = "any_file.avi"
1 голос
/ 25 марта 2009

Вам нужно переосмыслить свой дизайн.

Быстрый взлом состоит в том, чтобы фактически поместить имя переменной в ...

dict2['item_n'] = 'dict1'

или, может быть, использовать кортеж ..

dict2['item_n'] = ('dict1', dict1)

Есть функция с именем locals(), которая выдает словарь имен локальных переменных, возможно, вы можете рассмотреть это, когда переосмыслите свой дизайн.

Вот, посмотрите, как работает locals():

>>> x = 10
>>> y = 20
>>> c = "kmf"
>>> olk = 12
>>> km = (1,6,"r",x)
>>> from pprint import pprint
>>> pprint( locals() )
{'__builtins__': <module '__builtin__' (built-in)>,
 '__doc__': None,
 '__name__': '__main__',
 'c': 'kmf',
 'km': (1, 6, 'r', 10),
 'olk': 12,
 'pprint': <function pprint at 0x016A0EB0>,
 'x': 10,
 'y': 20}

UPDATE

Я хочу иметь возможность обновлять поле "комментарии" в FooBar1.avi:

WhichDict= dict_database[SomeUniqueIdentifier1]
WhichDict[WhichDict.keys()[0]][2]='newcomment'

Ну, это тривиально

dict_databse [идентификатор] [2] = the_new_comment

0 голосов
/ 25 марта 2009

Использование Гуппи .

from guppy import hpy
h=hpy()
h.iso(dict2['nth_dict_item']).sp

0: h.Root.i0_modules['__main__'].__dict__['dict1']
0 голосов
/ 25 марта 2009

Как я могу заставить это сказать мне что dict2 ['nth_dict_item'] есть или есть ссылаясь на "dict1"?

>>> print dict2['nth_dict_item'] is dict1
True
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...