将值列表添加到字典列表

时间:2020-02-21 14:33:58

标签: python python-3.x list dictionary

我有两个列表,一个列表包含字典,另一个列表值。

l_dic = [
  {
    'a': 5,
    'b': 7,
    'c': [1,2,3,4,5]
  },
  {
    'a': 12,
    'b': 4,
    'c': [1,2,3,4,5]
  }
]

val = [458,646]

现在我正尝试将值添加到字典中,因此结果看起来像这样:

res_dic = [
  {
    'a': 5,
    'b': 7,
    'c': [1,2,3,4,5],
    'd': 458
  },
  {
    'a': 12,
    'b': 4,
    'c': [1,2,3,4,5],
    'd': 646
  }
]

我该如何实现?

4 个答案:

答案 0 :(得分:2)

您可以将Python内置函数zip用于列表理解

l_dic = [{**d, 'd': e} for d, e in zip(l_dic, val)]

输出:

[
  {
    "a": 5,
    "b": 7,
    "c": [1, 2, 3, 4, 5],
    "d": 458
  },
  {
    "a": 12,
    "b": 4,
    "c": [1, 2, 3, 4, 5],
    "d": 646
  }
]

或者您可以使用for循环:

for d, v in zip(l_dic, val):
    d['d'] = v

这是建议的解决方案的基准:

from simple_benchmark import BenchmarkBuilder
b = BenchmarkBuilder()



@b.add_function()
def kederrac_for_loop(args):
    l_dic, val = args
    for d, v in zip(l_dic, val):
        d['d'] = v


@b.add_function()
def kederrac_list_comprehension(args):
    l_dic, val = args
    l_dic = [{**d, 'd': e} for d, e in zip(l_dic, val)]

@b.add_function()
def GoodDeeds_for_loop(args):
    l_dic, val = args
    for i in range(len(val)):
        l_dic[i]['d'] = val[i]

@b.add_function()        
def Nizam_solution(args)    : 
    l_dic, val = args
    def assign(x):
        l_dic[x]['d'] = val[x]

    #runs paralelly utilizing all cores on your machine
    ignore_this = [*map(lambda x: assign(x),range(len(l_dic)))]

@b.add_arguments('Number of elements')
def argument_provider():
    for exp in range(2, 16):
        size = 2**exp
        l_dic = [{i : choice(range(100)) for i in range(choice(range(3, 100)))} for _ in range(size)]
        val = list(range(size))

        yield size, (l_dic, val)

r = b.run()
r.plot()

输出:

enter image description here

如您所见,for循环解决方案是最快的解决方案

答案 1 :(得分:1)

您可以使用循环:

for i in range(len(val)):
    res_dic[i]['d'] = val[i]

假设res_dicval是长度相同的列表。

答案 2 :(得分:0)

您可以尝试使用map函数,该函数将一个函数和一个可迭代对象作为参数,并利用计算机上的所有内核并行地将该函数应用于可迭代对象中的每个元素

l_dic = [
  {
    'a': 5,
    'b': 7,
    'c': [1,2,3,4,5]
  },
  {
    'a': 12,
    'b': 4,
    'c': [1,2,3,4,5]
  }
]

val = [458,646]

def assign(x):
  l_dic[x]['d'] = val[x]

#runs paralelly utilizing all cores on your machine
ignore_this = [*map(lambda x: assign(x),range(len(l_dic)))]

输出

l_dic

{'a': 5, 'b': 7, 'c': [1, 2, 3, 4, 5], 'd': 458},
 {'a': 12, 'b': 4, 'c': [1, 2, 3, 4, 5], 'd': 646}]

答案 3 :(得分:0)

这个问题有点不确定,因为在26个项目之外并没有真正定义键的确切模式,但是在某些假设的情况下,您可以使用它。我们要做的是var randomhash = crypto.randomBytes(20).toString('hex');您的词典列表和项目列表,并逐行进行分配。

zip()

上面的代码将按以下模式插入带有键的项目:

def dict_list_apply(dict_list:list, items_list:list): def get_next_key(_dict): ab = "abcdefghijklmnopqrstuvwxyz" return ab[len(_dict)%len(ab)] * (len(_dict)//len(ab)+1) for _dict, _item in zip(dict_list, items_list): _dict[get_next_key(_dict)] = _item

这意味着我们可以无限期地继续向每个字典添加键,而不管其他字典的长度如何。

然后,如果我们运行以下命令:

a, b, ..., y, z, aa, bb, ..., yy, zz, aaa, bbb, ..., etc.

然后我们得到以下输出:

l_dic = [
  {
    'a': 5,
    'b': 7,
    'c': [1,2,3,4,5]
  },
  {
    'a': 12,
    'b': 4,
    'c': [1,2,3,4,5]
  }
]

val = [458,646]

for x in range(100):
    dict_list_apply(l_dic, map(lambda v: v + x, val))
pprint.pprint(l_dic)

现在,这不是生成密钥的唯一方法,因此您可以通过修改[{'a': 5, 'aa': 481, 'aaa': 507, 'aaaa': 533, 'b': 7, 'bb': 482, 'bbb': 508, 'bbbb': 534, 'c': [1, 2, 3, 4, 5], 'cc': 483, 'ccc': 509, 'cccc': 535, 'd': 458, 'dd': 484, 'ddd': 510, 'dddd': 536, 'e': 459, 'ee': 485, 'eee': 511, 'eeee': 537, 'f': 460, 'ff': 486, 'fff': 512, 'ffff': 538, 'g': 461, 'gg': 487, 'ggg': 513, 'gggg': 539, 'h': 462, 'hh': 488, 'hhh': 514, 'hhhh': 540, 'i': 463, 'ii': 489, 'iii': 515, 'iiii': 541, 'j': 464, 'jj': 490, 'jjj': 516, 'jjjj': 542, 'k': 465, 'kk': 491, 'kkk': 517, 'kkkk': 543, 'l': 466, 'll': 492, 'lll': 518, 'llll': 544, 'm': 467, 'mm': 493, 'mmm': 519, 'mmmm': 545, 'n': 468, 'nn': 494, 'nnn': 520, 'nnnn': 546, 'o': 469, 'oo': 495, 'ooo': 521, 'oooo': 547, 'p': 470, 'pp': 496, 'ppp': 522, 'pppp': 548, 'q': 471, 'qq': 497, 'qqq': 523, 'qqqq': 549, 'r': 472, 'rr': 498, 'rrr': 524, 'rrrr': 550, 's': 473, 'ss': 499, 'sss': 525, 'ssss': 551, 't': 474, 'tt': 500, 'ttt': 526, 'tttt': 552, 'u': 475, 'uu': 501, 'uuu': 527, 'uuuu': 553, 'v': 476, 'vv': 502, 'vvv': 528, 'vvvv': 554, 'w': 477, 'ww': 503, 'www': 529, 'wwww': 555, 'x': 478, 'xx': 504, 'xxx': 530, 'xxxx': 556, 'y': 479, 'yy': 505, 'yyy': 531, 'yyyy': 557, 'z': 480, 'zz': 506, 'zzz': 532}, {'a': 12, 'aa': 669, 'aaa': 695, 'aaaa': 721, 'b': 4, 'bb': 670, 'bbb': 696, 'bbbb': 722, 'c': [1, 2, 3, 4, 5], 'cc': 671, 'ccc': 697, 'cccc': 723, 'd': 646, 'dd': 672, 'ddd': 698, 'dddd': 724, 'e': 647, 'ee': 673, 'eee': 699, 'eeee': 725, 'f': 648, 'ff': 674, 'fff': 700, 'ffff': 726, 'g': 649, 'gg': 675, 'ggg': 701, 'gggg': 727, 'h': 650, 'hh': 676, 'hhh': 702, 'hhhh': 728, 'i': 651, 'ii': 677, 'iii': 703, 'iiii': 729, 'j': 652, 'jj': 678, 'jjj': 704, 'jjjj': 730, 'k': 653, 'kk': 679, 'kkk': 705, 'kkkk': 731, 'l': 654, 'll': 680, 'lll': 706, 'llll': 732, 'm': 655, 'mm': 681, 'mmm': 707, 'mmmm': 733, 'n': 656, 'nn': 682, 'nnn': 708, 'nnnn': 734, 'o': 657, 'oo': 683, 'ooo': 709, 'oooo': 735, 'p': 658, 'pp': 684, 'ppp': 710, 'pppp': 736, 'q': 659, 'qq': 685, 'qqq': 711, 'qqqq': 737, 'r': 660, 'rr': 686, 'rrr': 712, 'rrrr': 738, 's': 661, 'ss': 687, 'sss': 713, 'ssss': 739, 't': 662, 'tt': 688, 'ttt': 714, 'tttt': 740, 'u': 663, 'uu': 689, 'uuu': 715, 'uuuu': 741, 'v': 664, 'vv': 690, 'vvv': 716, 'vvvv': 742, 'w': 665, 'ww': 691, 'www': 717, 'wwww': 743, 'x': 666, 'xx': 692, 'xxx': 718, 'xxxx': 744, 'y': 667, 'yy': 693, 'yyy': 719, 'yyyy': 745, 'z': 668, 'zz': 694, 'zzz': 720}] 函数以提供所需的模式来更改它。