返回n个字典列表中第n个不同列表的n倍

时间:2016-07-10 16:29:03

标签: python dictionary list-comprehension

我有一本类似的词典:

[{ '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()? 可能会发布类似的问题,但我找不到简明扼要的解释方法,我缺少关键字。

如何制作完成该任务的功能?

2 个答案:

答案 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])]