2012-01-18 3 views
0

Надеюсь, я не хватает чего-то очевидное ...сохранение форматирования в словаре питона

Я создаю функцию, которая облегчит в создании специально отформатированные данные в формате JSON из запроса Django. Однако это должен быть чисто вопрос на питоне.

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

data = [['foo1','bar1'],['foo2','bar2']] 
format = {1:'VALUE says Hello world'} 

>> some_function(data, format) 
[['foo1','bar1 says Hello World'],['foo2','bar2 says Hello World']] 

Основная идея:

def some_function(data, format): 
    for row in data: 
     for count, value in enumerate(row): 
      if format.has_key(count): 
       #do something to replace 'VALUE' with value 
      else: 
       #just use value, no changes 
    return formatted_data 

Корень этот вопрос заключается в том, что данные поступают непосредственно в сеть, и я хотел бы определить конкретное форматирование на основе того, что я передаю через общую функцию.

Редактировать для ясности:

Что я должен добавить к some_function() преобразовать соответствующие значения в списке данных в формате, определенном в словаре формате?

ответ

3
def some_function(data, format): 
    result = [] 
    for row in data: 
     lst = [] 
     for count, value in enumerate(row): 
      if count in format: 
       string = format[count].format(value) 
       lst.append(string) 
      else: 
       lst.append(value) 
     result.append(lst) 
    return result 


data = [['foo1', 'bar1'], ['foo2', 'bar2']] 
format = {1: '{0} says Hello world'} 
print(some_function(data, format)) 
# prints: [['foo1', 'bar1 says Hello world'], ['foo2', 'bar2 says Hello world']] 

Формат, который вы можете использовать, поясняется в документе docs.

+0

Будучи новичком pythonista, мне приходилось делать 'type ({0})', чтобы понять, что это набор. Кажется чистым и менее опасным/уязвимым для ошибок/конфликтов, чем метод% format. Угадайте, что утром я читаю и тестирую док. Спасибо за ответ. –

+1

@j_syk, нет, это не набор. Это просто (часть) строка. Операция '.format' просто обрабатывает эту часть строки по-разному. Я отредактирую ссылку на документацию '.format'. –

+0

За пределами строки фигурные скобки используются для наборов и dicts, но внутри строки скобки {кудрявые} являются заполнителем для значения, которое будет заменено позже! – wim

1

Я предлагаю заменить формат {1:'%s says Hello world'}. Тогда вы можете:

def some_function(data, format): 
    formatted_data = [] 
    for row in data: 
     r = [] 
     for count, value in enumerate(row): 
      if count in format: 
       value = format[count] % value 

      r.append(value) 

     formatted_data.append(r) 

    return formatted_data 

Хотя есть более элегантные способы сделать задачу.

+0

вы знаете, я пытался что-то похожее на это, но то, что я делал пытался заменить ул «VALUE» с% s и он делает что-то в стиле фанк, когда побег/замещение. Я не считал, что передал% s напрямую ... см. Первые 6 слов моего сообщения. Во всяком случае, я постараюсь осуществить это утром и посмотреть, как это работает. Быстрый тест в оболочке выглядит неплохо. –

1

Нам нужны данные, которые преобразуются в каждую ячейку каждой строки, где «преобразование» определяется путем поиска «идентификатора столбца» ячейки (мы можем использовать enumerate для сопоставления идентификаторов с содержимым ячейки) в нашем формате "и применение соответствующего форматирования строк. Когда не применяется формат, мы хотим просто использовать исходное значение; мы можем справиться с этим, используя формат «по умолчанию», который имеет этот результат.

Это прописано:

def transform(data, formats): 
    return [ 
     [ 
      formats.get(i, '{0}').format(column) 
      for i, column in enumerate(row) 
     ] 
     for row in data 
    ] 

transform([['foo1','bar1'],['foo2','bar2']], {1:'{0} says Hello world'}) 
+0

приятно! но где я обманул вас, так это то, что мои данные на самом деле представляют собой список объектов (Django QuerySet), и я повторяю их и выборочно используя 'getattr()', чтобы создать список данных 'data' с функцией, которую я создаю , У меня было ощущение, что такое решение появится в результате моего упрощенного примера. Тем не менее, это простое и чистое решение для не переписывания неизменных данных. Спасибо Карлу! –

+0

Вы должны иметь возможность применять одни и те же методы. Это действительно то же самое, что делает @RobWouters, но с прямым, функционально-программным подходом. –

Смежные вопросы