Имена переменных со словарями? - PullRequest
2 голосов
/ 26 мая 2011

Python начинающий здесь.Вопрос о словарях.

Мой ввод - это список переменной длины (например, a = ['eggs', 'ham', 'bacon' ...]), который функционирует как список поисковых терминов, которые будут использоватьсяв импортированном файле CSV.

Я определил четыре функции, которые соответствуют каждому члену различным значениям из указанного файла CSV.Таким образом, каждый входной термин приведет к четырем спискам результатов.

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

Однако, поскольку список ввода имеет переменную длину, я хотел бы установить функцию для определения и присвоения имен словарям 'term1', 'term2', проиллюстрированным в основном так:

term1 = { 'eggs' : [[list1] , [list2] , [list3] , [list4]] }
term2 = { 'ham' : [[list1] , [list2] , [list3] , [list4]] }
term3 = { 'bacon' : [[list1] , [list2] , [list3] , [list4]] }

Есть ли а) способ назвать словари, как это ?;и б) И будут ли они доступны во всем мире?Если так, то как?Любая помощь очень ценится.

Ответы [ 3 ]

3 голосов
/ 26 мая 2011

Вы можете попробовать что-то вроде этого:

results = {}
for name in ['eggs', 'ham', 'bacon']:
   results[name] = (function1(name), function2(name), function3(name), function4(name),)

, где functionX - ваши функции, которые будут возвращать результат listX из файла CSV или чего-либо другого.

Здесь вы будете иметь в словаре результатовкак то так:

results = { 
   'eggs' : (egg_list1, egg_list2, egg_list3, egg_list4), 
   'ham' : (ham_list1, ham_list2, ham_list3, ham_list4),
   'bacon' : (bacon_list1, bacon_list2, bacon_list3, bacon_list4),
}
3 голосов
/ 26 мая 2011

Вот как вы можете предварительно инициализировать свой единственный словарь, содержащий все данные:

a = "eggs bacon ham".split()
summary = dict((key,([],[],[],[])) for key in a)

for lineno,line in enumerate(csv_file):
    # first element in the line is assumed to be the key ("eggs", "bacon", etc.)
    key = line[0]
    # update the data values for this key
    summary[key][0].append(lineno)
    summary[key][1].append(something_else)
    # ... etc.

Я нахожу этот вид индексированного доступа немного хрупким и предпочитаю доступ по ключу или по атрибутам.Ваш жестко запрограммированный список из 4 списков может быть лучше представлен как дикт или даже объекты некоторого простого класса подсчета данных.

Кроме того, я думаю, что ваш список "яиц", "бекона" и "ветчины" со временем будет расти, так как вы найдете записи в своем CSV-файле для "блинов", "вафель", "хэша"и так далее.В последнее время я все чаще и чаще использую defaultdict для подсчета данных при просмотре файлов данных или таблиц базы данных.Вместо того, чтобы заранее определять, какие ключи я ожидаю получить (и что мне нужно обновлять список самостоятельно, когда входные данные получают новые значения, добавленные к нему), defaultdict просто добавляет новые записи в форме, которую я определяю:

class Tally(object):
    def __init__(self):
        self.count = 0
        self.lines = []
        self.values = []

from collections import defaultdict
summary = defaultdict(Tally)

for lineno,line in enumerate(csv_file):
    # first element in the line is assumed to be the key ("eggs", "bacon", etc.)
    key = line[0]
    # update the data values for this key
    summary[key].count += 1
    summary[key].lines.append(lineno)
    summary[key].values.append(line[1])
    # ... etc.

defaultdict избавляет меня от громоздких и повторяющихся накладных расходов «если ключ не в summarydict: добавить новую запись ...», поэтому мой код остается довольно чистым.

2 голосов
/ 26 мая 2011

Я бы не рекомендовал такой подход, но вы можете обращаться как к локальным, так и к глобальным пространствам имен в качестве словарей; например Вы можете добавить произвольные переменные в эти пространства имен, используя знакомый интерфейс dict:

>>> globals()['foo'] = 'bar'
>>> foo
'bar'
>>> locals()['spam'] = 'eggs'
>>> spam
'eggs'

Вы столкнетесь с конфликтами имен. Кроме того, как остальная часть вашего кода узнает, какие глобальные переменные содержат ваши результаты? Им тоже придется делать непрямой поиск!

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

...