2012-01-18 107 views
0

格式化但願我不會缺少明顯的東西...存儲在一個Python字典

我創建將在從Django的查詢創建特定格式的JSON數據緩解作用。但是,這應該是一個純粹的python問題。

我希望能夠將所有值與給定的指標轉換爲指定格式的功能類似如下因素:

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 

的根這個問題是,數據直接到Web,我想定義具體的格式,基於我通過通用函數傳遞。

編輯爲清楚:

我應該添加到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})'來實現這個集合。似乎比%格式方法更清潔,更不危險/容易出錯/衝突。猜猜我早上有一些文檔閱讀和測試。謝謝回覆。 – 2012-01-18 23:05:08

+1

@j_syk,不,它不是一套。它只是(部分)一個字符串。 '.format'操作只是以不同的方式處理這部分字符串。我將編輯鏈接到'.format'文檔。 – 2012-01-18 23:09:49

+0

在字符串之外,花括號用於集合和字符串,但在字符串內部,{花括號}括號是將在稍後被替換的值的佔位符! – wim 2012-01-18 23:16:22

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

你知道,我想類似這樣的東西,但我在做什麼是試圖取代STR「VALUE」與%s和它做一些時髦的時候逃跑/代換。我沒有考慮直接傳遞%s ......看到我的文章的前6個字。無論如何,我會盡力在早上實施這個,看看它是如何工作的。在shell中的快速測試看起來不錯 – 2012-01-18 23:00:02

1

我們希望通過在我們的「格式」中查找單元格的「列ID」(我們可以使用enumerate將ID與單元格內容進行匹配)來定義「變換」每行中的每個單元格「字典並應用相應的字符串格式化程序。當沒有應用格式時,我們只想使用原始值;我們可以通過使用具有該結果的「默認」格式來處理該問題。

這是拼寫:

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()'創建列表的數據列表與我正在製作的函數。我有一種感覺,這個解決方案會出現在我簡化的例子中。但是,對於不重寫未更改的數據而言,這是一個很酷且乾淨的解決方案。謝謝Karl! – 2012-01-19 00:30:39

+0

但是,您應該可以應用相同的技巧。 @RobWouters的工作方式與直接的功能性編程方法完全相同。 – 2012-01-19 02:12:05