用字典制作列表,但字典中的较大值列表失败

时间:2019-01-27 07:14:52

标签: python list dictionary

我正在尝试将字典转换为将用于创建PySpark数据框的列表。我以为我已经原型化了,但是当我尝试使用更大的字典(值列表中有更多值)时,它给了我一个令人困惑的结果。谁能说出我做错了什么,或者提供另一种方式来获得我想要的结果?

我的字典的格式为:

{key1:[val1, val2, val3], key2:[val4, val5, val6]}

我正在使用一个函数将我的字典转换为列表,因此鉴于上述内容,我想生成:

[[key1,val1,val2,val3],[key2,val4,val5,val6]]

这是我的功能,并有一个正常工作的示例:

def make_data_list(dict_in):
    # convert dict to list
    input_list = list(dict_in)
    final_list = []
    for tr in input_list:
        data_list = [tr[0]]
        for v in tr[1]:
             data_list.append(v)
    final_list.append(data_list)

return final_list

example_dt = {"10065":[1,2,3,4], "10043":[5,6,7,8], "10025":[17,18,19,20]}

out_to_df = make_data_list(example_dt)
print(final_list)

这会按预期执行并返回

[['10065', 1, 2, 3, 4], ['10043', 5, 6, 7, 8], ['10025', 17, 18, 19, 20]]

但是,当我尝试使用更大的字典时,得到的结果却很奇怪,令人无法接受。因此,有了这个更大的(值列表中有更多值)字典:

dummy_large_dict = ({'1000000067':[9929, 33, 54, 125, 414, 766, 852, 612, 625, 844, 633, 749, 710, 769, 611, 635, 632,
                             919, 881, 653, 871, 658, 555, 646, 751, 662, 533, 637, 486, 688, 449, 562, 306, 513,
                             618, 281, 418, 428, 388, 477, 553, 549, 377, 421, 298, 486, 347, 378, 487, 376, 468,
                             460, 374, 566, 421, 469, 518, 403, 580, 474, 506, 404, 541, 421, 383, 481, 431, 504,
                             579, 693, 507, 443, 614, 570, 479, 610, 651, 496, 692, 617, 600, 694, 821, 758, 464,
                             1082, 749, 517, 639, 720, 545, 908, 852, 746, 703, 694, 861, 851, 771, 732, 762, 881,
                             672, 663, 927, 979, 903, 612, 618, 552, 699, 623, 687, 667, 647, 704, 622, 840, 811,
                             589, 719, 599, 665, 611, 524, 755, 695, 524, 510, 440, 651, 462, 429, 716, 666, 596,
                             493, 496, 480, 469, 351, 442, 378, 472, 448, 348, 441, 491, 382, 476, 381, 322, 549,
                             440, 483, 427, 383, 647, 336, 398, 571, 654, 531, 449, 609, 584, 578, 514, 516, 657,
                             481, 608, 785, 673, 724, 791, 524, 740, 783, 630, 719, 774, 587, 811, 683, 749, 802,
                             704, 936, 750, 868, 513, 796, 776, 784, 836, 771, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
                             0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
               '1000000154':[99929, 33, 54, 125, 414, 766, 852, 612, 625, 844, 633, 749, 710, 769, 611, 635, 632,
                             919, 881, 653, 871, 658, 555, 646, 751, 662, 533, 637, 486, 688, 449, 562, 306, 513,
                             618, 281, 418, 428, 388, 477, 553, 549, 377, 421, 298, 486, 347, 378, 487, 376, 468,
                             460, 374, 566, 421, 469, 518, 403, 580, 474, 506, 404, 541, 421, 383, 481, 431, 504,
                             579, 693, 507, 443, 614, 570, 479, 610, 651, 496, 692, 617, 600, 694, 821, 758, 464,
                             1082, 749, 517, 639, 720, 545, 908, 852, 746, 703, 694, 861, 851, 771, 732, 762, 881,
                             672, 663, 927, 979, 903, 612, 618, 552, 699, 623, 687, 667, 647, 704, 622, 840, 811,
                             589, 719, 599, 665, 611, 524, 755, 695, 524, 510, 440, 651, 462, 429, 716, 666, 596,
                             493, 496, 480, 469, 351, 442, 378, 472, 448, 348, 441, 491, 382, 476, 381, 322, 549,
                             440, 483, 427, 383, 647, 336, 398, 571, 654, 531, 449, 609, 584, 578, 1514, 2516, 3657,
                             841, 678, 785, 673, 624, 991, 524, 740, 873, 630, 719, 1774, 1587, 1811, 1683, 1749, 802,
                             704, 976, 1750, 3868, 513, 796, 776, 784, 836, 771, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
                             0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]})

out_to_df = make_data_list(dummy_large_dict)
print(out_to_df)

我得到了这个结果,我根本不明白。

[['1', '0'], ['1', '0']]

4 个答案:

答案 0 :(得分:0)

您可以简单地使用dictionary.items()遍历字典

您的代码可能看起来像这样

final_list = []

for key, value in dict_in.items():
   key_list = [key] + value
   final_list.apend(key_list)

return final_list

答案 1 :(得分:0)

使用列表理解:

import time, threading

def init():
    global iTime
    iTime = 1

def foo():

    global iTime
    iTime+=1
    threading.Timer(1, foo).start()

init()
foo()

答案 2 :(得分:0)

列表和字典操作之间的代码似乎有些混乱。

尽管评论中提到了解决此问题的其他方法,但是如果您希望采用这种方法,或者对它为什么不起作用有所了解,那么这里的重写将保留dict()结构,该结构应该用来说明什么是您原始代码中的错误。但是,按照书面形式,我看不到较小的dict在您发布的代码中如何返回大的返回值。也许您在尝试更大的dict之前没有意识到就进行了更改?:

def make_data_list(dict_in):
    # convert dict to list
    # input_list = list(dict_in)
    input_list = dict_in
    final_list = []
    for tr in input_list.keys():
        data_list = [tr]
        for value in input_list[tr]:
            data_list.append(value)
        final_list.append(data_list)

    return final_list


example_dt = {"10065":[1,2,3,4], "10043":[5,6,7,8], "10025":[17,18,19,20]}

out_to_df = make_data_list(example_dt)
print(out_to_df)

在您的原始代码中,您只是从希望作为dict的键的位置中切出第一位和第二位,但是已经转换为列表。

此外,如前所述,您的代码应该只是失败,因为return不会缩进。

答案 3 :(得分:0)

def make_data_list(dict_in):
    # convert dict to list
    input_list = list(dict_in)

这使input_list成为dict_in的的列表(这是不必要的,因为您可以直接对dict进行for循环,但其他人已经对此进行了介绍。)

final_list = []
for tr in input_list:
    data_list = [tr[0]]

因此,tr是键之一,而tr[0]是键的第一个字符。

for v in tr[1]:

tr[1]是第二个字符,并且此循环仅循环一个字符。

         data_list.append(v)
final_list.append(data_list)

这就是为什么您的列表以[['1', '0'], ['1', '0']]结尾的原因。不知道哪个版本的代码可以与您的其他示例一起使用,但是这个版本不起作用。