Создание списка из словаря, но не с большим списком значений в dict - PullRequest
0 голосов
/ 27 января 2019

Я пытаюсь преобразовать словарь в список, который будет использоваться для создания фрейма данных 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 голосов
/ 27 января 2019
def make_data_list(dict_in):
    # convert dict to list
    input_list = list(dict_in)

Это делает input_list список ключей dict_in (это не нужно, так как вы можете сделать цикл for непосредственно по dict, но другие уже это рассмотрели).

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']].Не знаю, какая версия кода работала с вашим другим примером, но этот не работает.

0 голосов
/ 27 января 2019

Использовать понимание списка:

final_list = [k]+v for k,v in example_dt.items()]
0 голосов
/ 27 января 2019

Кажется, в вашем коде есть некоторая путаница между операциями list и 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)

В своем исходном коде вы просто отсекаете первую и вторую цифры от того, что вы хотите использовать в качестве ключа в диктовке, но которое было преобразовано в список.

Кроме того, как написано, ваш код должен просто не работать, потому что return не смещен.

0 голосов
/ 27 января 2019

Вы можете просто перебрать словарь, используя dictionary.items()

Ваш код может выглядеть следующим образом

final_list = []

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

return final_list
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...