我有一本类似的词典:
[{ '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 :(得分: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]}]
答案 1 :(得分: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])]