2015-11-04 26 views
0

我有一套15 dictsintfloat值。鑰匙當然沒有排序。我想:如何將多個字典的值轉儲到二維數組的列中?

  • 填充一個2D numpy陣列大小爲50x15,使得dict1下列0對準,那些dict2對準的下塔1,等等的值。

然而,在做這件事之前,我需要將字典排序從最小到最大。

這是二維數組應該如何看起來像:

dict1 dict2 dict3 dict4 dict5 dict6 dictn 
val val val val val val val 
val val val val val val val 

我可以做一個單一for循環?或者我應該使用3嵌套for循環,類似於下一個代碼塊?如果是這樣,我該如何前進到下一個dict

#do stuff 
for i in range(array.shape[0]): 
     for j in range(array.shape[1]): 
      for val in dict1.items(): 
       array[i][0]=dict1[val] 
#do stuff 
+1

你能舉一個例子嗎?所有'len'的字典都是50嗎? – vk1011

+0

使用* dict *項目分享示例輸入? – Divakar

+0

'dict1 = {'event1':3400,'event2':2345,'event3':7654,...}'。 @ vk1011是的,所有的字典都有'len' 50 – FaCoffee

回答

1

dicts = [dict1, dict2, dict3,...] 

那麼你可以做:

dataarray = np.zeros((50,15),float) 
for i, adict in enumerate(dicts): 
    values = current_dict.values() 
    for j,value in enumerate(values): 
      dataarray[i,j]= value 

我使用enumerate你可以用1個襯墊做到這一點得到索引號,因爲它更加Pythonic和更清潔。但是,如果dataarray不夠大,則會出現問題。

[i,j]是索引2d數組元素的正確方法。

我修改的剪輯對鍵沒有任何作用,所以我忽略了這些(到目前爲止)。

再次讀你的問題,我看到你想排序的關鍵。在這種情況下,我們需要使用:

items = adict.items() 
    # list of key,value pairs 
    items.sort() # may need to tweak sort parameters 
    for j, (key, [value) in enumerate(items): 
     dataarray[i,j] = value 

我還沒有測試過這段代碼,所以可能會有一些bug。但大綱是正確的 - 我想。

如果您需要匹配dataarray行中的密鑰,我們將不得不做更多的工作。


我將使用表達式像

max_dict_size = max([len(d) for d in dicts]) 

找到辭書的最大尺寸,並且相應地定義dataarray

它只是發生在我身上,我不需要迭代將字典值添加到數組。我將用一個簡單的字典來說明:

In [111]: dd={1:2.,3:4.,4:324.23} # sample dictionary 

In [112]: data=np.zeros((5,2),dtype=float) # empty array 

In [113]: items=dd.items() 
In [114]: items 
Out[114]: [(1, 2.0), (3, 4.0), (4, 324.23)] 

從這個元組列表中獲取值。其實這也是一個迭代。

In [115]: values=[v for k,v in items] 
In [116]: values 
Out[116]: [2.0, 4.0, 324.23] 

填寫data欄。爲了更加安全,我應該使用values[:data.shape[0](如果data對於本字典來說不夠大)。

In [117]: data[:len(values),0]=values 

In [118]: data 
Out[118]: 
array([[ 2. , 0. ], 
     [ 4. , 0. ], 
     [ 324.23, 0. ], 
     [ 0. , 0. ], 
     [ 0. , 0. ]]) 

但是,如果所有的字典具有相同的大小,dataarray是正確的大小,所有這些交叉檢查可以被排除在外。

+0

你最後的塊應該嵌套在'for'循環中,因爲我有多個'dicts'。我對麼? – FaCoffee

+1

是的,它的目的是修改以前的一部分。 – hpaulj

+0

有幾個問題:1)如果dataarray太小,爲什麼會出現問題? 2)你所謂的'current_dict'應該是'adict',而不是正確的? 3)'dataarray'的問題引用了一個錯誤,如'IndexError:索引2超出軸2的邊界,大小爲2或類似?謝謝!並帶回超音速! – FaCoffee

1

假設你有你的類型的字典在一個名爲dicts列表,並且已經從itertools進口zip_longestizip_longest(取決於Python版本)。如果您收集的字典到像列表

[ tuple('dict{}'.format(i+1) for i in range(len(dicts))) ] + list(zip_longest(*([ v for k,v in sorted(d.items())] for d in dicts))) 
+3

但是它的密碼非常密集,所以你可能想把它分解爲可讀性 –

+0

我對這個密度沒問題。我唯一的問題:因爲我的輸出是一個'list',其中第一個'tuple'具有我的字典名稱,後面的元組保存了相應的值,我怎樣才能將它打印到'csv'文件? for循環應該如何?謝謝! – FaCoffee

+1

使用[CSV](https://docs.python.org/3/library/csv.html)模塊(例如''csvwriter.writerows()') –

相關問題