2016-07-10 122 views
1

我有一個類似於此的字典:返回n次的第n個數字

[{ 'key' : 10, 'values' : [ [1,2] [3,4,5] [6,7,8,9] ] }, { ... }] 

我試圖返回與「交集」爲重點和第n個元素的新字典每個列表的值都是最長列表中的值。該名單有不同的長度時,短的也只是有他們的最後的值追加多次,像這樣的:

{10:[1,3,6]} 

{10:[2,4,7]} 

{10:[2,5,8]} 

{10:[2,5,9]} 

我應該迭代爲itervalues(),iterkey(),或iteritems()? 可能有類似的問題發佈,但我找不到一個簡潔的解釋方式,我缺少關鍵字。

如何製作完成該任務的功能?

+0

是您填寫期望的輸出? –

+0

什麼是交點*? –

+0

@Cunningham輸出將是以'key'作爲關鍵字值的一系列字典。 'intersection'只是我用於自己的代碼而不是'key'的實際字符串。 (整數實際上是從不同長度的多行中得到的Qgis點數,但我覺得他們保持不了這個問題的清晰度。) –

回答

1

,因爲在數字最長列表項你需要迭代多次。在每次迭代中,您都使用增量索引從每個列表中獲取第n個值。

嘗試是這樣的:

def intersect(key,values): 
    """ 
    Return n times the nth number of every list in `values`, 
    in a list of dictionaries. 
    """ 
    intersect_list = [] 
    longest = max(map(len,values)) 
    for n in range(longest): 
     # get the nth value if there is one, or just the last value 
     nth_values = [l[n] if n<len(l) else l[-1] for l in values] 
     intersect_list.append({key:nth_values}) 
    return intersect_list 

dict_list = [{ 'key':10, 'values':[[1,2],[3,4,5],[6,7,8,9]] }] 
for d in dict_list: 
    print(intersect(d['key'],d['values'])) 

它會給你所需的輸出:

[{10: [1, 3, 6]}, {10: [2, 4, 7]}, {10: [2, 5, 8]}, {10: [2, 5, 9]}] 
+0

謝謝,這個工作非常好。這裏的「地圖」與[Qmap](http://doc.qt.io/qt-4.8/qmap.html#details)相同嗎? –

+0

內建函數'map()'獲取'values'中的每個項目並將'len()'函數應用於它。因此,你得到一個長度列表,然後用max()'最大。 –

+0

所以'map()'和Qmap不一樣。 –

0

這是一個應該工作的單線程,但請注意,您的輸出不能是字典,因爲您無法在字典中多次顯示相同的鍵。

def intersection(key, values): 
    return [(key, [L[i] if len(L) > i else L[-1] for L in values]) for i in range(max(map(len, values)))] 

print(intersection(10, ([1,2], [3,4,5], [6,7,8,9]))) 

# >>> [(10, [1, 3, 6]), (10, [2, 4, 7]), (10, [2, 5, 8]), (10, [2, 5, 9])]