我正在尝试将字典转换为将用于创建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']]
答案 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']]
结尾的原因。不知道哪个版本的代码可以与您的其他示例一起使用,但是这个版本不起作用。