хранение форматирования в словаре Python - PullRequest
0 голосов
/ 19 января 2012

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

Я создаю функцию, которая облегчит создание специально отформатированных данных 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 ]

3 голосов
/ 19 января 2012
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.

1 голос
/ 19 января 2012

Нам нужны данные, которые получаются в результате преобразования каждой ячейки в каждой строке, где «преобразование» определяется путем поиска «идентификатора столбца» ячейки (мы можем использовать 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'})
1 голос
/ 19 января 2012

Я бы предложил заменить формат на {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

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

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