Попсование отрицательного числа работает, но не для нуля - PullRequest
1 голос
/ 25 мая 2019

В своем коде я беру словарь: {2: 'f', 0: 'x', 4: 'z', -3: 'z'} в качестве параметра и превратить его в список. Я должен распечатать буквы (значения) на определенную величину, заданную их ключом (целым числом), например, пара ключей 4: «z» означает, что буква z будет напечатана 4 раза. Я указал, что любой ключ меньше 1 вообще не должен выводиться, и он работает для ключа -3, но по какой-то причине ключ 0 по-прежнему появляется, несмотря на то, что я указал выталкивать любой целочисленный ключ меньше 1. Это то, что мой вывод выглядит на данный момент:

1.
0. <--- This should be removed
2: ff
4: zzzz

Но это должно быть как:

1.
2: ff
4: zzzz

Код:

def draw_rows(dictionary):
    turn_list = list(dictionary.keys())
    turn_list.sort()
    for num in turn_list:
        if num < 1:
            turn_list.pop(turn_list[num])
    for key in turn_list:
        print(key,": ", dictionary[key] * key, sep="")

def test_draw_rows():

    print("1.")
    draw_rows({2: 'f', 0: 'x', 4: 'z', -3: 'z'})

Ответы [ 2 ]

1 голос
/ 25 мая 2019

Если вы предпочитаете более простой код, то приведенный ниже код должен работать.

def draw_rows(dictionary):
    for k, v in dictionary.items():
        if k > 0:
            print(k, ':', v * k)

def test_draw_rows():
    print('1.')
    draw_rows({2: 'f', 0: 'x', 4: 'z', -3: 'z'})

test_draw_rows()

Выход:

1.
2 : ff
4 : zzzz
1 голос
/ 25 мая 2019

Для начала вы извлекаете элемент из списка turn_list, который является копией списка словарей turn_list = list(dictionary.keys()), и извлечение элемента из этого списка не повлияет на исходный словарь.

Таким образом, вы захотите вставить ключ в сам исходный словарь, перебирая копию словаря, поскольку вы не можете обновить словарь, перебирая его

def draw_rows(dictionary):

    #Take copy of the dictionary
    dict_copy = dictionary.copy()

    #Iterate over the copy
    for key in dict_copy:
        #If key is less than 1, pop that key-value pair from dict
        if key < 1:
            dictionary.pop(key)

    #Print the dictionary
    for key in dictionary:
        print(key,": ", dictionary[key] * key, sep="")

def test_draw_rows():

    print("1.")
    draw_rows({2: 'f', 0: 'x', 4: 'z', -3: 'z'})

test_draw_rows()

Вы также можете упростить свой кодчерез понимание словаря, где вы создаете новый словарь с key > 1

def draw_rows(dictionary):

    #Use dictionary comprehenstion to make a dictionary with keys > 1
    dictionary = {key:value for key, value in dictionary.items() if key > 0}

    #Print the dictionary
    for key in dictionary:
        print(key,": ", dictionary[key] * key, sep="")

def test_draw_rows():

    print("1.")
    draw_rows({2: 'f', 0: 'x', 4: 'z', -3: 'z'})

test_draw_rows()

Выходными данными в обоих случаях будет

1.
2: ff
4: zzzz

Если целью является только печать, мы можем выполнить итерациюи напечатайте только необходимые пары ключ-значение.

def draw_rows(dictionary):

    #Iterate over dictionary
    for key, value in dictionary.items():
        #Print only those k-v pairs which satisfy condition
        if not key < 1:
            print(key,": ", value * key, sep="")

def test_draw_rows():

    print("1.")
    draw_rows({2: 'f', 0: 'x', 4: 'z', -3: 'z'})

test_draw_rows()
...